int main(void) { message_queue *q = mq_create(); message_node *n = NULL; printf("size should be 0, is %d\n", mq_size(q)); mq_push_msgz(q, "one"); mq_push_msgz(q, "two"); mq_push_msgz(q, "three"); printf("size should be 3, is %d\n", mq_size(q)); n = mq_pop(q); printf("expecting \"one\", got \"%s\"\n", n->message); mn_destroy(n); mq_push_msgz(q, "four"); n = mq_pop(q); printf("expecting \"two\", got \"%s\"\n", n->message); mn_destroy(n); n = mq_pop(q); printf("expecting \"three\", got \"%s\"\n", n->message); mn_destroy(n); printf("size should be 1, is %d\n", mq_size(q)); n = mq_pop(q); printf("expecting \"four\", got \"%s\"\n", n->message); mn_destroy(n); printf("size should be 0, is %d\n", mq_size(q)); n = mq_pop(q); printf("expecting \"%p\", got \"%p\"\n", NULL, n); mq_destroy(q); return 0; }
/*! @brief メッセージ送信成功後の処理。 */ void success_message() { retry_count = 0; if (mq_pop()) { DBG_LOG(APP_LOG_LEVEL_DEBUG, "pop!!!"); send_message(); } }
int cell_dispatch_message(struct cell *c) { cell_lock(c); if (c->quit) { cell_destroy(c); return CELL_QUIT; } struct message m; int empty = mq_pop(&c->mq, &m); if (empty || c->L == NULL) { cell_unlock(c); return CELL_EMPTY; } cell_grab(c); cell_unlock(c); lua_pushvalue(c->L, 1); // dup callback lua_pushinteger(c->L, m.port); lua_pushlightuserdata(c->L, m.buffer); lua_call(c->L, 2, 0); cell_release(c); return CELL_MESSAGE; }
void mq_removeMessage(MessageQueue *q, HvMessage *m, void (*sendMessage)(struct HvBase *, int, const HvMessage *)) { if (mq_hasMessage(q)) { if (mq_node_getMessage(q->head) == m) { // msg in head node // only remove the message if sendMessage is the same as the stored one, // if the sendMessage argument is NULL, it is not checked and will remove any matching message pointer if (sendMessage == NULL || q->head->sendMessage == sendMessage) { mq_pop(q); } } else { MessageNode *prevNode = q->head; MessageNode *currNode = q->head->next; while ((currNode != NULL) && (currNode->m != m)) { prevNode = currNode; currNode = currNode->next; } if (currNode != NULL) { if (sendMessage == NULL || currNode->sendMessage == sendMessage) { mp_freeMessage(&q->mp, m); currNode->m = NULL; currNode->let = 0; currNode->sendMessage = NULL; if (currNode == q->tail) { // msg in tail node prevNode->next = NULL; q->tail = prevNode; } else { // msg in middle node prevNode->next = currNode->next; currNode->next->prev = prevNode; } currNode->next = (q->pool == NULL) ? NULL : q->pool; currNode->prev = NULL; q->pool = currNode; } } } } }
void mq_clear(MessageQueue *q) { while (mq_hasMessage(q)) { mq_pop(q); } }