Permalink
Browse files

More hacking on event_iocp.c: make it compile, and give it more of an…

… interface. This code is now testable.

svn:r1176
  • Loading branch information...
1 parent 09c23b6 commit 0b987813537b74835a5c3990de756d35ea9b4fbc Nick Mathewson committed Apr 16, 2009
Showing with 60 additions and 10 deletions.
  1. +50 −7 event_iocp.c
  2. +10 −3 iocp-internal.h
View
@@ -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. */
+}
View
@@ -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
}

0 comments on commit 0b98781

Please sign in to comment.