]> granicus.if.org Git - libevent/commitdiff
More hacking on event_iocp.c: make it compile, and give it more of an interface....
authorNick Mathewson <nickm@torproject.org>
Thu, 16 Apr 2009 00:32:52 +0000 (00:32 +0000)
committerNick Mathewson <nickm@torproject.org>
Thu, 16 Apr 2009 00:32:52 +0000 (00:32 +0000)
svn:r1176

event_iocp.c
iocp-internal.h

index 6e2db448d663141fab1e7c1ab241b4dd443025b6..b5bfd14d9485f2e4a35c84b2eafde9104e3c0c1c 100644 (file)
@@ -1,11 +1,12 @@
 
-#include "event-config.h"
-#include <sys/types.h>
 #include <windows.h>
-#include <WinBase.h>
+#include <process.h>
+
 #include "event2/util.h"
 #include "util-internal.h"
 #include "iocp-internal.h"
+#include "log-internal.h"
+#include "mm-internal.h"
 
 void
 event_overlapped_init(struct event_overlapped *o, iocp_callback cb)
@@ -17,26 +18,68 @@ event_overlapped_init(struct event_overlapped *o, iocp_callback cb)
 static void
 handle_entry(OVERLAPPED *o, ULONG_PTR completion_key, DWORD nBytes)
 {
-       OVERLAPPED *o = ent->lpOverlapped;
        struct event_overlapped *eo =
            EVUTIL_UPCAST(o, struct event_overlapped, overlapped);
-       eo = upcast(o, struct event_overlapped, overlapped);
        eo->cb(eo, completion_key, nBytes);
 }
 
 static void
-loop(struct event_iocp_port *port, long ms)
+loop(void *_port)
 {
+       struct event_iocp_port *port = _port;
        OVERLAPPED *overlapped;
        ULONG_PTR key;
        DWORD bytes;
+       long ms = port->ms;
 
        if (ms <= 0)
                ms = INFINITE;
 
-       while(GetQueuedCompletionStatus(port->port, &nBytes, &key,
+
+       while (GetQueuedCompletionStatus(port->port, &bytes, &key,
                &overlapped, ms)) {
+               if (port->shutdown)
+                       return;
                handle_entry(overlapped, key, bytes);
        }
+       event_warnx("GetQueuedCompletionStatus exited with no event.");
+}
+
+int
+event_iocp_port_associate(struct event_iocp_port *port, evutil_socket_t fd,
+    uintptr_t key)
+{
+       HANDLE h;
+       h = CreateIoCompletionPort((HANDLE)fd, port->port, key, port->n_threads);
+       if (!h)
+               return -1;
+       return 0;
 }
 
+struct event_iocp_port *
+event_iocp_port_launch(void)
+{
+       struct event_iocp_port *port;
+       int thread, i;
+
+       if (!(port = mm_calloc(1, sizeof(struct event_iocp_port))))
+               return NULL;
+       port->n_threads = 2;
+       port->port = CreateIoCompletionPort(NULL, NULL, 0, port->n_threads);
+       port->ms = -1;
+       if (!port->port)
+               mm_free(port);
+
+       for (i=0; i<port->n_threads; ++i)
+               thread = _beginthread(loop, 0, port);
+
+       return port;
+}
+
+
+void
+event_iocp_shutdown(struct event_iocp_port *port)
+{
+       port->shutdown = 1;
+       /* XXX notify. */
+}
index 9d49a7c0572a5e4b1caac5cd11b4cafd53c33ebf..bb9b4c29d969b73047ed6f2f4b4f114c4c4c03bf 100644 (file)
@@ -41,13 +41,20 @@ struct event_overlapped {
 
 struct event_iocp_port {
        HANDLE port;
+       int n_threads;
+       int shutdown;
+       long ms;
 };
 
+struct evbuffer;
 void event_overlapped_init(struct event_overlapped *, iocp_callback cb);
+int evbuffer_launch_read(struct evbuffer *, size_t n);
+int evbuffer_launch_write(struct evbuffer *, ssize_t n);
 
-struct evbuffer;
-int evbuffer_launch_write(struct evbuffer *buf, ssize_t atmost);
-int evbuffer_launch_read(struct evbuffer *buf, size_t atmost);
+struct event_iocp_port *event_iocp_port_launch(void);
+int event_iocp_port_associate(struct event_iocp_port *port, evutil_socket_t fd,
+    uintptr_t key);
+void event_iocp_shutdown(struct event_iocp_port *port);
 
 #ifdef __cplusplus
 }