diff --git a/service-src/service_harbor.c b/service-src/service_harbor.c index c852aa5c..3a809481 100644 --- a/service-src/service_harbor.c +++ b/service-src/service_harbor.c @@ -211,6 +211,7 @@ harbor_create(void) { h->remote_addr[i] = NULL; } h->map = _hash_new(); + h->starting_msg = NULL; return h; } diff --git a/skynet-src/socket_kqueue.h b/skynet-src/socket_kqueue.h index bdd7a1fd..54884b6a 100644 --- a/skynet-src/socket_kqueue.h +++ b/skynet-src/socket_kqueue.h @@ -25,6 +25,15 @@ sp_release(int kfd) { close(kfd); } +static void +sp_del(int kfd, int sock) { + struct kevent ke; + EV_SET(&ke, sock, EVFILT_READ, EV_DELETE, 0, 0, NULL); + kevent(kfd, &ke, 1, NULL, 0, NULL); + EV_SET(&ke, sock, EVFILT_WRITE, EV_DELETE, 0, 0, NULL); + kevent(kfd, &ke, 1, NULL, 0, NULL); +} + static int sp_add(int kfd, int sock, void *ud) { struct kevent ke; @@ -32,21 +41,27 @@ sp_add(int kfd, int sock, void *ud) { if (kevent(kfd, &ke, 1, NULL, 0, NULL) == -1) { return 1; } + EV_SET(&ke, sock, EVFILT_WRITE, EV_ADD, 0, 0, ud); + if (kevent(kfd, &ke, 1, NULL, 0, NULL) == -1) { + EV_SET(&ke, sock, EVFILT_READ, EV_DELETE, 0, 0, NULL); + kevent(kfd, &ke, 1, NULL, 0, NULL); + return 1; + } + EV_SET(&ke, sock, EVFILT_WRITE, EV_DISABLE, 0, 0, ud); + if (kevent(kfd, &ke, 1, NULL, 0, NULL) == -1) { + sp_del(kfd, sock); + return 1; + } return 0; } -static void -sp_del(int kfd, int sock) { - struct kevent ke; - EV_SET(&ke, sock, EVFILT_READ | EVFILT_WRITE, EV_DELETE, 0, 0, NULL); - kevent(kfd, &ke, 1, NULL, 0, NULL); -} - static void sp_write(int kfd, int sock, void *ud, bool enable) { struct kevent ke; EV_SET(&ke, sock, EVFILT_WRITE, enable ? EV_ENABLE : EV_DISABLE, 0, 0, ud); - kevent(kfd, &ke, 1, NULL, 0, NULL); + if (kevent(kfd, &ke, 1, NULL, 0, NULL) == -1) { + // todo: check error + } } static int @@ -57,9 +72,9 @@ sp_wait(int kfd, struct event *e, int max) { int i; for (i=0;i