X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fsock_man.c;fp=src%2Fsock_man.c;h=725a901b7c52bdcb1c3551f530dbd3fc8df09a10;hb=3cb026de413f8130490ada85f2bc0b460172e4ef;hp=0000000000000000000000000000000000000000;hpb=770b156ad12cf75c816cdbe7f935493b812d6b5c;p=yaz-moved-to-github.git diff --git a/src/sock_man.c b/src/sock_man.c new file mode 100644 index 0000000..725a901 --- /dev/null +++ b/src/sock_man.c @@ -0,0 +1,122 @@ + +#include +#include +#include +#include + +struct yaz_sock_man_s { + yaz_sock_chan_t chan_list; + yaz_sock_chan_t free_list; + NMEM nmem; + int epoll_handle; + int maxevents; + yaz_sock_chan_t *events; +}; + +struct yaz_sock_chan_s { + yaz_sock_chan_t next; + yaz_sock_chan_t prev; + int fd; + unsigned mask; + void *data; +}; + +yaz_sock_man_t yaz_sock_man_new(void) +{ + NMEM nmem = nmem_create(); + yaz_sock_man_t man = nmem_malloc(nmem, sizeof(*man)); + man->nmem = nmem; + man->chan_list = 0; + man->free_list = 0; + man->epoll_handle = epoll_create(100); + man->maxevents = 30; + man->events = nmem_malloc(nmem, man->maxevents * sizeof(*man->events)); + if (man->epoll_handle == -1) + { + yaz_sock_man_destroy(man); + return 0; + } + return man; +} + +void yaz_sock_man_destroy(yaz_sock_man_t man) +{ + if (man) + { + if (man->epoll_handle != -1) + close(man->epoll_handle); + assert(man->chan_list == 0); + nmem_destroy(man->nmem); + } +} + +yaz_sock_chan_t yaz_sock_chan_new(yaz_sock_man_t srv, int fd, void *data) +{ + yaz_sock_chan_t p; + if (srv->free_list) + { + p = srv->free_list; + srv->free_list = p->next; + } + else + p = nmem_malloc(srv->nmem, sizeof(*p)); + p->next = srv->chan_list; + if (p->next) + p->next->prev = p; + p->prev = 0; + srv->chan_list = p; + + p->fd = fd; + p->mask = 0; + p->data = data; + return p; +} + +void yaz_sock_chan_destroy(yaz_sock_man_t srv, yaz_sock_chan_t p) +{ + if (p->prev) + p->prev->next = p->next; + else + { + assert(srv->chan_list == p); + srv->chan_list = p->next; + } + + if (p->next) + p->next->prev = p->prev; + + p->next = srv->free_list; + p->prev = 0; + srv->free_list = p; +} + +yaz_sock_chan_t yaz_sock_man_wait(yaz_sock_man_t man) +{ + return 0; +} + +void yaz_sock_chan_set_mask(yaz_sock_chan_t chan, unsigned mask) +{ + chan->mask = mask; +} + +unsigned yaz_sock_get_mask(yaz_sock_chan_t chan) +{ + return chan->mask; +} + +void *yaz_sock_chan_get_data(yaz_sock_chan_t chan) +{ + return chan->data; +} + + +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +