diff options
Diffstat (limited to 'event_iocp.c')
-rw-r--r-- | event_iocp.c | 57 |
1 files changed, 50 insertions, 7 deletions
diff --git a/event_iocp.c b/event_iocp.c index 6e2db448..b5bfd14d 100644 --- a/event_iocp.c +++ b/event_iocp.c @@ -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. */ +} |