]> rtime.felk.cvut.cz Git - frescor/forb.git/blob - src/peer.c
Source files moved to a separate directory
[frescor/forb.git] / src / peer.c
1 #include "peer.h"
2 #include "misc.h"
3 #include "proto.h"
4
5 GAVL_CUST_NODE_INT_IMP(forb_peer_nolock,/* cust_prefix */
6                        forb_t,          /* cust_root_t */
7                        forb_peer_t,     /* cust_item_t */
8                        forb_server_id,  /* cust_key_t */
9                        peers,           /* cust_root_node */
10                        node,            /* cust_item_node */
11                        server_id,       /* cust_item_key */
12                        forb_server_id_cmp);/* cust_cmp_fnc */
13
14
15
16 forb_peer_t *
17 forb_peer_new(void)
18 {
19         forb_peer_t *peer;
20         
21         peer = forb_malloc(sizeof(*peer));
22         if (peer) {
23                 forb_ref_init(&peer->ref);
24         }
25         return peer;
26 }
27
28 void
29 forb_peer_release(forb_ref_t *ref)
30 {
31         forb_peer_t *peer = container_of(ref, forb_peer_t, ref);
32         if (peer->port->proto->peer_destroy) {
33                 peer->port->proto->peer_destroy(peer);
34         }
35         forb_free(peer);
36 }
37
38 void
39 forb_peer_delete_by_port(forb_t *forb, forb_port_t *port)
40 {
41         forb_peer_t *peer;
42         fosa_mutex_lock(&port->forb->peer_mutex);
43         /* FIXME: Is gavl_cust_for_each() deletion safe? What about
44          * recursive locking of mutex. */
45 #warning Delete during GAVL traversal is probably not correct.
46         gavl_cust_for_each(forb_peer_nolock, forb, peer) {
47                 if (peer->port == port) {
48                         forb_peer_nolock_delete(forb, peer);
49                         forb_peer_put(peer);
50                 }
51         }
52         fosa_mutex_unlock(&port->forb->peer_mutex);
53 }