Esempio n. 1
0
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;
}
Esempio n. 2
0
/*!
 @brief メッセージ送信成功後の処理。
 */
void success_message()
{
    retry_count = 0;
    if (mq_pop()) {
        DBG_LOG(APP_LOG_LEVEL_DEBUG, "pop!!!");
        send_message();
    }
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
        }
      }
    }
  }
}
Esempio n. 5
0
void mq_clear(MessageQueue *q) {
  while (mq_hasMessage(q)) {
    mq_pop(q);
  }
}