double check the message queue when releasing in_global_queue lock

This commit is contained in:
Kezhu Wang
2012-08-05 22:07:56 +08:00
parent 38c3f50327
commit 3700d5828e

View File

@@ -158,12 +158,18 @@ skynet_context_message_dispatch(void) {
assert(ctx->in_global_queue); assert(ctx->in_global_queue);
int re_q = 1;
struct skynet_message msg; struct skynet_message msg;
if (skynet_mq_pop(q,&msg)) { if (skynet_mq_pop(q,&msg)) {
// empty queue // empty queue
__sync_lock_release(&ctx->in_global_queue); __sync_lock_release(&ctx->in_global_queue);
skynet_context_release(ctx); if (skynet_mq_pop(q,&msg)) {
return 0; skynet_context_release(ctx);
return 0;
}
if (__sync_lock_test_and_set(&ctx->in_global_queue, 1)) {
re_q = 0;
}
} }
if (ctx->cb == NULL) { if (ctx->cb == NULL) {
@@ -178,7 +184,9 @@ skynet_context_message_dispatch(void) {
skynet_context_release(ctx); skynet_context_release(ctx);
skynet_globalmq_push(q); if (re_q) {
skynet_globalmq_push(q);
}
return 0; return 0;
} }