summaryrefslogtreecommitdiff
path: root/event_iocp.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2009-04-16 00:32:52 +0000
committerNick Mathewson <nickm@torproject.org>2009-04-16 00:32:52 +0000
commit0b987813537b74835a5c3990de756d35ea9b4fbc (patch)
tree4e57fb80f1391d1823f5c3fdbae3a8e18a09be47 /event_iocp.c
parent09c23b6a5679b1a4a871bdd3143e615209aac05d (diff)
downloadlibevent-0b987813537b74835a5c3990de756d35ea9b4fbc.tar.gz
More hacking on event_iocp.c: make it compile, and give it more of an interface. This code is now testable.
svn:r1176
Diffstat (limited to 'event_iocp.c')
-rw-r--r--event_iocp.c57
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. */
+}