From 6be6a8171f928a0c7b75814dfba90abed814165c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=A3=8E?= Date: Fri, 2 Aug 2013 10:45:00 +0800 Subject: [PATCH] session id always be positive --- gate/mread.c | 47 ++++++++++++++++++++++---------------- skynet-src/skynet_server.c | 5 ++-- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/gate/mread.c b/gate/mread.c index 79b9044e..d4ee4f0f 100644 --- a/gate/mread.c +++ b/gate/mread.c @@ -107,7 +107,7 @@ client_send(struct send_client *c, int fd) { switch(errno) { case EINTR: continue; - case EAGAIN: + case EWOULDBLOCK: return; } free_buffer(c); @@ -143,6 +143,25 @@ client_push(struct send_client *c, void * buf, int sz, void * ptr) { } } +static void +try_close(struct mread_pool * self, struct socket * s) { + if (s->client.head == NULL) { + turn_off(self, s); + } + if (s->status != SOCKET_HALFCLOSE) { + return; + } + if (s->client.head == NULL) { + s->status = SOCKET_CLOSED; + s->node = NULL; + s->temp = NULL; + event_del(self->efd, s->fd); + close(s->fd); +// printf("MREAD close %d (fd=%d)\n",id,s->fd); + ++self->closed; + } +} + void mread_push(struct mread_pool *self, int id, void * buffer, int size, void * ptr) { struct socket * s = &self->sockets[id]; @@ -160,6 +179,13 @@ mread_push(struct mread_pool *self, int id, void * buffer, int size, void * ptr) switch(errno) { case EINTR: continue; + case EWOULDBLOCK: + break; + default: + // write error : close fd + s->status = SOCKET_HALFCLOSE; + try_close(self, s); + return; } break; } @@ -327,25 +353,6 @@ _read_queue(struct mread_pool * self, int timeout) { return n; } -static void -try_close(struct mread_pool * self, struct socket * s) { - if (s->client.head == NULL) { - turn_off(self, s); - } - if (s->status != SOCKET_HALFCLOSE) { - return; - } - if (s->client.head == NULL) { - s->status = SOCKET_CLOSED; - s->node = NULL; - s->temp = NULL; - event_del(self->efd, s->fd); - close(s->fd); -// printf("MREAD close %d (fd=%d)\n",id,s->fd); - ++self->closed; - } -} - inline static struct socket * _read_one(struct mread_pool * self) { for (;;) { diff --git a/skynet-src/skynet_server.c b/skynet-src/skynet_server.c index 10e9c945..671358f1 100644 --- a/skynet-src/skynet_server.c +++ b/skynet-src/skynet_server.c @@ -127,7 +127,8 @@ skynet_context_new(const char * name, const char *param) { int skynet_context_newsession(struct skynet_context *ctx) { - int session = ++ctx->session_id; + // session always be a positive number + int session = (++ctx->session_id) & 0x7fffffff; return session; } @@ -353,8 +354,6 @@ skynet_command(struct skynet_context * context, const char * cmd , const char * char * session_ptr = NULL; int ti = strtol(param, &session_ptr, 10); int session = skynet_context_newsession(context); - if (session < 0) - return NULL; skynet_timeout(context->handle, ti, session); sprintf(context->result, "%d", session); return context->result;