]> rtime.felk.cvut.cz Git - frescor/fwp.git/blob - fwp/mngr/fwp_agent_table.c
23addb6e112b7c42b752855d351f772d2cd761bb
[frescor/fwp.git] / fwp / mngr / fwp_agent_table.c
1 #include "fwp_agent_table.h"
2 #include <stdlib.h>
3
4 typedef
5 struct {
6         unsigned int                    nr_agents;
7         /*pthread_mutex_t               lock; */
8         /*gavl_cust_root_field_t        root;*/
9         gavl_node_t                     *agent_tree;
10         pthread_mutex_t                 lock;
11 } fwp_agent_table_t;
12
13 GAVL_CUST_NODE_INT_DEC(_fwp_agent_table, fwp_agent_table_t, fwp_agent_data_t,
14                         unsigned int, agent_tree, tree_node, _addr, 
15                         gavl_cmp_int);
16
17 GAVL_CUST_NODE_INT_IMP(_fwp_agent_table, fwp_agent_table_t, fwp_agent_data_t, 
18                         unsigned int, agent_tree, tree_node, _addr, 
19                         gavl_cmp_int);
20
21 fwp_agent_table_t  fwp_agent_table = {
22                 .nr_agents = 0,
23                 .agent_tree = NULL,
24                 .lock = PTHREAD_MUTEX_INITIALIZER,
25 };
26
27 void fwp_agent_table_insert(fwp_sockaddr_t *agent_sockaddr)
28 {
29         struct sockaddr_in *addr_in;
30         fwp_agent_data_t *agdata;
31
32         agdata = fwp_agent_table_find(agent_sockaddr);
33         if (!agdata) {
34                 /* Alloc new agent data */
35                 agdata = (fwp_agent_data_t*)malloc(sizeof(fwp_agent_data_t));
36                 addr_in = (struct sockaddr_in*) agent_sockaddr->addr;
37                 agdata->_addr = addr_in->sin_addr.s_addr; 
38                 memcpy(&agdata->addr, agent_sockaddr, sizeof(fwp_sockaddr_t));
39                 fwp_contract_table_init(&agdata->contract_table);
40         }
41         
42         pthread_mutex_lock(&fwp_agent_table.lock);
43         _fwp_agent_table_insert(&fwp_agent_table, agdata);
44         fwp_agent_table.nr_agents++;
45         pthread_mutex_unlock(&fwp_agent_table.lock);
46 }
47
48 fwp_agent_data_t* fwp_agent_table_find(fwp_sockaddr_t *agent_sockaddr)
49 {
50         unsigned int addr;
51         struct sockaddr_in *addr_in;
52
53         addr_in = (struct sockaddr_in*) agent_sockaddr->addr;
54         addr = addr_in->sin_addr.s_addr; 
55         
56         return _fwp_agent_table_find(&fwp_agent_table, &addr);
57 }
58
59 int fwp_agent_table_delete(fwp_agent_data_t *agdata)
60 {
61         int rv;
62
63         pthread_mutex_lock(&fwp_agent_table.lock);
64         rv = _fwp_agent_table_delete(&fwp_agent_table, agdata); 
65         fwp_agent_table.nr_agents--;
66         pthread_mutex_unlock(&fwp_agent_table.lock);
67         
68         return rv;
69 }