mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-25 04:33:05 +00:00
bugfix: blockcall
This commit is contained in:
@@ -12,8 +12,14 @@
|
|||||||
#define DEFAULT_QUEUE_SIZE 64;
|
#define DEFAULT_QUEUE_SIZE 64;
|
||||||
#define MAX_GLOBAL_MQ 0x10000
|
#define MAX_GLOBAL_MQ 0x10000
|
||||||
|
|
||||||
|
// 0 means mq is not in global mq.
|
||||||
|
// 1 means mq is in global mq , or the message is dispatching.
|
||||||
|
// 2 means message is dispatching with locked session set.
|
||||||
|
// 3 means mq is not in global mq, and locked session has been set.
|
||||||
|
|
||||||
#define MQ_IN_GLOBAL 1
|
#define MQ_IN_GLOBAL 1
|
||||||
#define MQ_LOCKED 2
|
#define MQ_DISPATCHING 2
|
||||||
|
#define MQ_LOCKED 3
|
||||||
|
|
||||||
struct message_queue {
|
struct message_queue {
|
||||||
uint32_t handle;
|
uint32_t handle;
|
||||||
@@ -158,10 +164,9 @@ _pushhead(struct message_queue *q, struct skynet_message *message) {
|
|||||||
|
|
||||||
// this api use in push a unlock message, so the in_global flags must not be 0 ,
|
// this api use in push a unlock message, so the in_global flags must not be 0 ,
|
||||||
// but the q is not exist in global queue.
|
// but the q is not exist in global queue.
|
||||||
if (q->in_global == MQ_IN_GLOBAL) {
|
if (q->in_global == MQ_LOCKED) {
|
||||||
skynet_globalmq_push(q);
|
skynet_globalmq_push(q);
|
||||||
} else {
|
q->in_global = MQ_IN_GLOBAL;
|
||||||
assert(q->in_global == MQ_LOCKED);
|
|
||||||
}
|
}
|
||||||
q->lock_session = 0;
|
q->lock_session = 0;
|
||||||
}
|
}
|
||||||
@@ -222,21 +227,17 @@ skynet_mq_force_push(struct message_queue * queue) {
|
|||||||
|
|
||||||
void
|
void
|
||||||
skynet_mq_pushglobal(struct message_queue *queue) {
|
skynet_mq_pushglobal(struct message_queue *queue) {
|
||||||
|
LOCK(queue)
|
||||||
assert(queue->in_global);
|
assert(queue->in_global);
|
||||||
if (queue->in_global == MQ_LOCKED) {
|
if (queue->in_global == MQ_DISPATCHING) {
|
||||||
// lock message queue just now, unlock it.
|
// lock message queue just now.
|
||||||
LOCK(queue)
|
queue->in_global = MQ_LOCKED;
|
||||||
queue->in_global = MQ_IN_GLOBAL;
|
|
||||||
if (queue->lock_session == 0) {
|
|
||||||
skynet_globalmq_push(queue);
|
|
||||||
}
|
|
||||||
UNLOCK(queue)
|
|
||||||
} else {
|
|
||||||
queue->in_global = MQ_IN_GLOBAL;
|
|
||||||
if (queue->lock_session == 0) {
|
|
||||||
skynet_globalmq_push(queue);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (queue->lock_session == 0) {
|
||||||
|
skynet_globalmq_push(queue);
|
||||||
|
queue->in_global = MQ_IN_GLOBAL;
|
||||||
|
}
|
||||||
|
UNLOCK(queue)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
Reference in New Issue
Block a user