725a901b7c52bdcb1c3551f530dbd3fc8df09a10
[yaz-moved-to-github.git] / src / sock_man.c
1
2 #include <yaz/sock_man.h>
3 #include <yaz/nmem.h>
4 #include <assert.h>
5 #include <sys/epoll.h>
6
7 struct yaz_sock_man_s {
8     yaz_sock_chan_t chan_list;
9     yaz_sock_chan_t free_list;
10     NMEM nmem;
11     int epoll_handle;
12     int maxevents;
13     yaz_sock_chan_t *events;
14 };
15
16 struct yaz_sock_chan_s {
17     yaz_sock_chan_t next;
18     yaz_sock_chan_t prev;
19     int fd;
20     unsigned mask;
21     void *data;
22 };
23
24 yaz_sock_man_t yaz_sock_man_new(void)
25 {
26     NMEM nmem = nmem_create();
27     yaz_sock_man_t man = nmem_malloc(nmem, sizeof(*man));
28     man->nmem = nmem;
29     man->chan_list = 0;
30     man->free_list = 0;
31     man->epoll_handle = epoll_create(100);
32     man->maxevents = 30;
33     man->events = nmem_malloc(nmem, man->maxevents * sizeof(*man->events));
34     if (man->epoll_handle == -1)
35     {
36         yaz_sock_man_destroy(man);
37         return 0;
38     }
39     return man;
40 }
41
42 void yaz_sock_man_destroy(yaz_sock_man_t man)
43 {
44     if (man)
45     {
46         if (man->epoll_handle != -1)
47             close(man->epoll_handle);
48         assert(man->chan_list == 0);
49         nmem_destroy(man->nmem);
50     }
51 }
52
53 yaz_sock_chan_t yaz_sock_chan_new(yaz_sock_man_t srv, int fd, void *data)
54 {
55     yaz_sock_chan_t p;
56     if (srv->free_list)
57     {
58         p = srv->free_list;
59         srv->free_list = p->next;
60     }
61     else
62         p = nmem_malloc(srv->nmem, sizeof(*p));
63     p->next = srv->chan_list;
64     if (p->next)
65         p->next->prev = p;
66     p->prev = 0;
67     srv->chan_list = p;
68
69     p->fd = fd;
70     p->mask = 0;
71     p->data = data;
72     return p;
73 }
74
75 void yaz_sock_chan_destroy(yaz_sock_man_t srv, yaz_sock_chan_t p)
76 {
77     if (p->prev)
78         p->prev->next = p->next;
79     else
80     {
81         assert(srv->chan_list == p);
82         srv->chan_list = p->next;
83     }
84
85     if (p->next)
86         p->next->prev = p->prev;
87     
88     p->next = srv->free_list;
89     p->prev = 0;
90     srv->free_list = p;
91 }
92
93 yaz_sock_chan_t yaz_sock_man_wait(yaz_sock_man_t man)
94 {
95     return 0;
96 }
97
98 void yaz_sock_chan_set_mask(yaz_sock_chan_t chan, unsigned mask)
99 {
100     chan->mask = mask;
101 }
102
103 unsigned yaz_sock_get_mask(yaz_sock_chan_t chan)
104 {
105     return chan->mask;
106 }
107
108 void *yaz_sock_chan_get_data(yaz_sock_chan_t chan)
109 {
110     return chan->data;
111 }
112
113
114 /*
115  * Local variables:
116  * c-basic-offset: 4
117  * c-file-style: "Stroustrup"
118  * indent-tabs-mode: nil
119  * End:
120  * vim: shiftwidth=4 tabstop=8 expandtab
121  */
122