summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--buffer_iocp.c7
-rw-r--r--event_iocp.c21
-rw-r--r--iocp-internal.h2
-rw-r--r--listener.c7
4 files changed, 22 insertions, 15 deletions
diff --git a/buffer_iocp.c b/buffer_iocp.c
index 5071a9db..b52f84d6 100644
--- a/buffer_iocp.c
+++ b/buffer_iocp.c
@@ -111,7 +111,7 @@ pin_release(struct event_overlapped *eo, unsigned flag)
/** IOCP callback invoked when a read operation is finished. */
static void
-read_completed(struct event_overlapped *eo, uintptr_t _, ev_ssize_t nBytes)
+read_completed(struct event_overlapped *eo, uintptr_t _, ev_ssize_t nBytes, int ok)
{
struct buffer_overlapped *buf_o = upcast_overlapped(eo);
struct evbuffer_overlapped *buf = buf_o->buf;
@@ -120,6 +120,8 @@ read_completed(struct event_overlapped *eo, uintptr_t _, ev_ssize_t nBytes)
struct evbuffer_iovec iov[2];
int n_vec;
+ // XXXX use ok
+
EVBUFFER_LOCK(evbuf, EVTHREAD_WRITE);
buf->read_in_progress = 0;
evbuffer_unfreeze(evbuf, 0);
@@ -145,8 +147,9 @@ read_completed(struct event_overlapped *eo, uintptr_t _, ev_ssize_t nBytes)
/** IOCP callback invoked when a write operation is finished. */
static void
-write_completed(struct event_overlapped *eo, uintptr_t _, ev_ssize_t nBytes)
+write_completed(struct event_overlapped *eo, uintptr_t _, ev_ssize_t nBytes, int ok)
{
+ // XXX use ok
struct buffer_overlapped *buf_o = upcast_overlapped(eo);
struct evbuffer_overlapped *buf = buf_o->buf;
diff --git a/event_iocp.c b/event_iocp.c
index b4350ef6..9cce605b 100644
--- a/event_iocp.c
+++ b/event_iocp.c
@@ -47,28 +47,29 @@ event_overlapped_init(struct event_overlapped *o, iocp_callback cb)
}
static void
-handle_entry(OVERLAPPED *o, ULONG_PTR completion_key, DWORD nBytes)
+handle_entry(OVERLAPPED *o, ULONG_PTR completion_key, DWORD nBytes, int ok)
{
struct event_overlapped *eo =
EVUTIL_UPCAST(o, struct event_overlapped, overlapped);
- eo->cb(eo, completion_key, nBytes);
+ eo->cb(eo, completion_key, nBytes, ok);
}
static void
loop(void *_port)
{
struct event_iocp_port *port = _port;
- OVERLAPPED *overlapped;
- ULONG_PTR key;
- DWORD bytes;
long ms = port->ms;
HANDLE p = port->port;
if (ms <= 0)
ms = INFINITE;
- while (GetQueuedCompletionStatus(p, &bytes, &key,
- &overlapped, ms)) {
+ while (1) {
+ OVERLAPPED *overlapped=NULL;
+ ULONG_PTR key=0;
+ DWORD bytes=0;
+ int ok = GetQueuedCompletionStatus(p, &bytes, &key,
+ &overlapped, ms);
EnterCriticalSection(&port->lock);
if (port->shutdown) {
if (--port->n_live_threads == 0)
@@ -78,8 +79,10 @@ loop(void *_port)
}
LeaveCriticalSection(&port->lock);
- if (key != NOTIFICATION_KEY)
- handle_entry(overlapped, key, bytes);
+ if (key != NOTIFICATION_KEY && overlapped)
+ handle_entry(overlapped, key, bytes, ok);
+ else if (!overlapped)
+ break;
}
event_warnx("GetQueuedCompletionStatus exited with no event.");
EnterCriticalSection(&port->lock);
diff --git a/iocp-internal.h b/iocp-internal.h
index 31024cc1..18b89d25 100644
--- a/iocp-internal.h
+++ b/iocp-internal.h
@@ -34,7 +34,7 @@ extern "C" {
struct event_overlapped;
struct event_iocp_port;
struct evbuffer;
-typedef void (*iocp_callback)(struct event_overlapped *, uintptr_t, ev_ssize_t);
+typedef void (*iocp_callback)(struct event_overlapped *, uintptr_t, ev_ssize_t, int success);
/* This whole file is actually win32 only. We wrap the structures in a win32
* ifdef so that we can test-compile code that uses these interfaces on
diff --git a/listener.c b/listener.c
index 8cdaef56..e1406254 100644
--- a/listener.c
+++ b/listener.c
@@ -297,7 +297,7 @@ struct accepting_socket {
};
static void accepted_socket_cb(struct event_overlapped *o, uintptr_t key,
- ev_ssize_t n);
+ ev_ssize_t n, int ok);
static struct accepting_socket *
new_accepting_socket(struct evconnlistener_iocp *lev, int family)
@@ -370,7 +370,7 @@ start_accepting(struct accepting_socket *as)
as->buflen/2, as->buflen/2,
&pending, &as->overlapped.overlapped)) {
/* Immediate success! */
- accepted_socket_cb(&as->overlapped, 1, 0);
+ accepted_socket_cb(&as->overlapped, 1, 0, 1);
result = 0;
} else {
int err = WSAGetLastError();
@@ -395,10 +395,11 @@ stop_accepting(struct accepting_socket *as)
#endif
static void
-accepted_socket_cb(struct event_overlapped *o, uintptr_t key, ev_ssize_t n)
+accepted_socket_cb(struct event_overlapped *o, uintptr_t key, ev_ssize_t n, int ok)
{
/* Run this whole thing deferred unless some MT flag is set */
/* XXX needs locking. */
+ /* XXX use ok */
struct sockaddr *sa_local=NULL, *sa_remote=NULL;
int socklen_local=0, socklen_remote=0;