X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fmq.c;h=14e0816e28b3f2aa6e989320ed1ff463321bbf79;hb=34f34474b6137233d6700d4599f42257e8208af2;hp=5e40059c24090348ec4c4be6e3d73bf248b8a99d;hpb=8cdcce63c7a938409dee4a745a891c4df7dbc349;p=oweals%2Fgnunet.git diff --git a/src/util/mq.c b/src/util/mq.c index 5e40059c2..14e0816e2 100644 --- a/src/util/mq.c +++ b/src/util/mq.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - (C) 2012-2014 Christian Grothoff (and other contributing authors) + Copyright (C) 2012-2014 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -60,7 +60,7 @@ struct GNUNET_MQ_Envelope GNUNET_MQ_NotifyCallback sent_cb; /** - * Closure for send_cb + * Closure for @e send_cb */ void *sent_cls; }; @@ -133,12 +133,12 @@ struct GNUNET_MQ_Handle /** * Task scheduled during #GNUNET_MQ_impl_send_continue. */ - GNUNET_SCHEDULER_TaskIdentifier continue_task; + struct GNUNET_SCHEDULER_Task * continue_task; /** - * Next id that should be used for the assoc_map, + * Next id that should be used for the @e assoc_map, * initialized lazily to a random value together with - * assoc_map + * @e assoc_map */ uint32_t assoc_id; }; @@ -207,23 +207,22 @@ GNUNET_MQ_inject_message (struct GNUNET_MQ_Handle *mq, const struct GNUNET_MQ_MessageHandler *handler; int handled = GNUNET_NO; - handler = mq->handlers; - if (NULL == handler) + if (NULL == mq->handlers) { LOG (GNUNET_ERROR_TYPE_WARNING, "No handler for message of type %d\n", ntohs (mh->type)); return; } - for (; NULL != handler->cb; handler++) + for (handler = mq->handlers; NULL != handler->cb; handler++) { if (handler->type == ntohs (mh->type)) { handler->cb (mq->handlers_cls, mh); handled = GNUNET_YES; + break; } } - if (GNUNET_NO == handled) LOG (GNUNET_ERROR_TYPE_WARNING, "No handler for message of type %d\n", @@ -307,10 +306,10 @@ impl_send_continue (void *cls, struct GNUNET_MQ_Handle *mq = cls; struct GNUNET_MQ_Envelope *current_envelope; - if ((tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0) + if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) return; - mq->continue_task = GNUNET_SCHEDULER_NO_TASK; + mq->continue_task = NULL; /* call is only valid if we're actually currently sending * a message */ current_envelope = mq->current_envelope; @@ -345,7 +344,7 @@ impl_send_continue (void *cls, void GNUNET_MQ_impl_send_continue (struct GNUNET_MQ_Handle *mq) { - GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == mq->continue_task); + GNUNET_assert (NULL == mq->continue_task); mq->continue_task = GNUNET_SCHEDULER_add_now (&impl_send_continue, mq); } @@ -399,9 +398,9 @@ const struct GNUNET_MessageHeader * GNUNET_MQ_impl_current (struct GNUNET_MQ_Handle *mq) { if (NULL == mq->current_envelope) - GNUNET_abort (); + GNUNET_assert (0); if (NULL == mq->current_envelope->mh) - GNUNET_abort (); + GNUNET_assert (0); return mq->current_envelope->mh; } @@ -776,21 +775,25 @@ GNUNET_MQ_destroy (struct GNUNET_MQ_Handle *mq) { mq->destroy_impl (mq, mq->impl_state); } - if (GNUNET_SCHEDULER_NO_TASK != mq->continue_task) + if (NULL != mq->continue_task) { GNUNET_SCHEDULER_cancel (mq->continue_task); - mq->continue_task = GNUNET_SCHEDULER_NO_TASK; + mq->continue_task = NULL; } while (NULL != mq->envelope_head) { struct GNUNET_MQ_Envelope *ev; ev = mq->envelope_head; + ev->parent_queue = NULL; GNUNET_CONTAINER_DLL_remove (mq->envelope_head, mq->envelope_tail, ev); GNUNET_MQ_discard (ev); } if (NULL != mq->current_envelope) { + /* we can only discard envelopes that + * are not queued! */ + mq->current_envelope->parent_queue = NULL; GNUNET_MQ_discard (mq->current_envelope); mq->current_envelope = NULL; } @@ -805,36 +808,30 @@ GNUNET_MQ_destroy (struct GNUNET_MQ_Handle *mq) } -struct GNUNET_MessageHeader * +const struct GNUNET_MessageHeader * GNUNET_MQ_extract_nested_mh_ (const struct GNUNET_MessageHeader *mh, uint16_t base_size) { uint16_t whole_size; uint16_t nested_size; - struct GNUNET_MessageHeader *nested_msg; + const struct GNUNET_MessageHeader *nested_msg; whole_size = ntohs (mh->size); GNUNET_assert (whole_size >= base_size); - nested_size = whole_size - base_size; - if (0 == nested_size) return NULL; - if (nested_size < sizeof (struct GNUNET_MessageHeader)) { GNUNET_break_op (0); return NULL; } - - nested_msg = (struct GNUNET_MessageHeader *) ((char *) mh + base_size); - + nested_msg = (const struct GNUNET_MessageHeader *) ((char *) mh + base_size); if (ntohs (nested_msg->size) != nested_size) { GNUNET_break_op (0); - nested_msg->size = htons (nested_size); + return NULL; } - return nested_msg; }