Working on epoll socket layer
[yaz-moved-to-github.git] / src / sock_man.c
diff --git a/src/sock_man.c b/src/sock_man.c
new file mode 100644 (file)
index 0000000..725a901
--- /dev/null
@@ -0,0 +1,122 @@
+
+#include <yaz/sock_man.h>
+#include <yaz/nmem.h>
+#include <assert.h>
+#include <sys/epoll.h>
+
+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
+ */
+