From 02f2f88b6d4269eaac328172a668de2475a62b9e Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Tue, 13 May 2014 13:35:37 +0800 Subject: [PATCH] Fix issue #109 --- skynet-src/socket_server.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/skynet-src/socket_server.c b/skynet-src/socket_server.c index b3ea5e0a..f013fd1b 100644 --- a/skynet-src/socket_server.c +++ b/skynet-src/socket_server.c @@ -815,6 +815,22 @@ report_accept(struct socket_server *ss, struct socket *s, struct socket_message return 1; } +static inline void +clear_closed_event(struct socket_server *ss, struct socket_message * result, int type) { + if (type == SOCKET_CLOSE || type == SOCKET_ERROR) { + int id = result->id; + int i; + for (i=ss->event_index; ievent_n; i++) { + struct event *e = &ss->ev[i]; + struct socket *s = e->s; + if (s) { + if (s->type == SOCKET_TYPE_INVALID && s->id == id) { + e->s = NULL; + } + } + } + } +} // return type int @@ -823,9 +839,10 @@ socket_server_poll(struct socket_server *ss, struct socket_message * result, int if (ss->checkctrl) { if (has_cmd(ss)) { int type = ctrl_cmd(ss, result); - if (type != -1) + if (type != -1) { + clear_closed_event(ss, result, type); return type; - else + } else continue; } else { ss->checkctrl = 0; @@ -865,12 +882,14 @@ socket_server_poll(struct socket_server *ss, struct socket_message * result, int int type = send_buffer(ss, s, result); if (type == -1) break; + clear_closed_event(ss, result, type); return type; } if (e->read) { int type = forward_message(ss, s, result); if (type == -1) break; + clear_closed_event(ss, result, type); return type; } break;