void skynet_mq_push(struct message_queue *q, struct skynet_message *message) { assert(message); LOCK(q) if (q->lock_session !=0 && message->session == q->lock_session) { _pushhead(q,message); } else { q->queue[q->tail] = *message; if (++ q->tail >= q->cap) { q->tail = 0; } if (q->head == q->tail) { expand_queue(q); } if (q->lock_session == 0) { if (q->in_global == 0) { q->in_global = MQ_IN_GLOBAL; skynet_globalmq_push(q); } } } UNLOCK(q) }
void skynet_mq_pushglobal(struct message_queue *queue) { assert(queue->in_global); if (queue->lock_session == 0) { skynet_globalmq_push(queue); } }
static void _pushhead(struct message_queue *q, struct skynet_message *message) { int head = q->head - 1; if (head < 0) { head = q->cap - 1; } if (head == q->tail) { expand_queue(q); --q->tail; head = q->cap - 1; } q->queue[head] = *message; q->head = head; // 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. if (q->in_global == MQ_LOCKED) { skynet_globalmq_push(q); q->in_global = MQ_IN_GLOBAL; } else { assert(q->in_global == MQ_DISPATCHING); } q->lock_session = 0; }
void skynet_mq_mark_release(struct message_queue *q) { LOCK(q) assert(q->release == 0); q->release = 1; if (q->in_global != MQ_IN_GLOBAL) { skynet_globalmq_push(q); } UNLOCK(q) }
static void _unlock(struct message_queue *q) { // 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. if (q->in_global == MQ_LOCKED) { skynet_globalmq_push(q); q->in_global = MQ_IN_GLOBAL; } else { assert(q->in_global == MQ_DISPATCHING); } q->lock_session = 0; }
void skynet_mq_pushglobal(struct message_queue *queue) { LOCK(queue) assert(queue->in_global); if (queue->in_global == MQ_DISPATCHING) { // lock message queue just now. queue->in_global = MQ_LOCKED; } if (queue->lock_session == 0) { skynet_globalmq_push(queue); queue->in_global = MQ_IN_GLOBAL; } UNLOCK(queue) }
static void _pushhead(struct message_queue *q, struct skynet_message *message) { int head = q->head - 1; if (head < 0) { head = q->cap - 1; } if (head == q->tail) { expand_queue(q); --q->tail; head = q->cap - 1; } q->queue[head] = *message; q->head = head; // this api use in push a unlock message, so the in_global flags must be 1 , but the q is not exist in global queue. assert(q->in_global); skynet_globalmq_push(q); }
void skynet_mq_force_push(struct message_queue * queue) { assert(queue->in_global); skynet_globalmq_push(queue); }