From 3700d5828eea6c375da9aec09bc0c0ba8224f3e3 Mon Sep 17 00:00:00 2001 From: Kezhu Wang Date: Sun, 5 Aug 2012 22:07:56 +0800 Subject: [PATCH] double check the message queue when releasing in_global_queue lock --- skynet_server.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/skynet_server.c b/skynet_server.c index 95677821..c91d7712 100644 --- a/skynet_server.c +++ b/skynet_server.c @@ -158,12 +158,18 @@ skynet_context_message_dispatch(void) { assert(ctx->in_global_queue); + int re_q = 1; struct skynet_message msg; if (skynet_mq_pop(q,&msg)) { // empty queue __sync_lock_release(&ctx->in_global_queue); - skynet_context_release(ctx); - return 0; + if (skynet_mq_pop(q,&msg)) { + skynet_context_release(ctx); + return 0; + } + if (__sync_lock_test_and_set(&ctx->in_global_queue, 1)) { + re_q = 0; + } } if (ctx->cb == NULL) { @@ -178,7 +184,9 @@ skynet_context_message_dispatch(void) { skynet_context_release(ctx); - skynet_globalmq_push(q); + if (re_q) { + skynet_globalmq_push(q); + } return 0; }