aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacki <jacki@thejackimonster.de>2024-07-09 00:07:19 +0200
committerJacki <jacki@thejackimonster.de>2024-07-09 00:07:19 +0200
commitcc17efdd940dc6abad29e51765d2fbf44953afdd (patch)
treec668d6d534f3156f2ff4841ee9ed5e347dd7a9d9
parent9f7d0a0e84dbf11e2ec169bb2d05d720e4017324 (diff)
downloadgnunet-cc17efdd940dc6abad29e51765d2fbf44953afdd.tar.gz
gnunet-cc17efdd940dc6abad29e51765d2fbf44953afdd.zip
MQ: Send prior enqueued message if queue is busy during send call
Signed-off-by: Jacki <jacki@thejackimonster.de>
-rw-r--r--src/lib/util/mq.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/src/lib/util/mq.c b/src/lib/util/mq.c
index 18ec3deda..c2ca5a1b8 100644
--- a/src/lib/util/mq.c
+++ b/src/lib/util/mq.c
@@ -296,6 +296,7 @@ GNUNET_MQ_get_length (struct GNUNET_MQ_Handle *mq)
296 { 296 {
297 return mq->queue_length; 297 return mq->queue_length;
298 } 298 }
299 GNUNET_assert (0 < mq->queue_length);
299 return mq->queue_length - 1; 300 return mq->queue_length - 1;
300} 301}
301 302
@@ -318,15 +319,24 @@ GNUNET_MQ_send (struct GNUNET_MQ_Handle *mq,
318 } 319 }
319 ev->parent_queue = mq; 320 ev->parent_queue = mq;
320 /* is the implementation busy? queue it! */ 321 /* is the implementation busy? queue it! */
321 if ((NULL != mq->current_envelope) || (NULL != mq->send_task) || 322 if ((NULL != mq->current_envelope) || (NULL != mq->send_task))
322 (NULL != mq->envelope_head))
323 { 323 {
324 GNUNET_CONTAINER_DLL_insert_tail (mq->envelope_head, 324 GNUNET_CONTAINER_DLL_insert_tail (mq->envelope_head,
325 mq->envelope_tail, 325 mq->envelope_tail,
326 ev); 326 ev);
327 return; 327 return;
328 } 328 }
329 GNUNET_assert (NULL == mq->envelope_head); 329 else if (NULL != mq->envelope_head)
330 {
331 GNUNET_CONTAINER_DLL_insert_tail (mq->envelope_head,
332 mq->envelope_tail,
333 ev);
334
335 ev = mq->envelope_head;
336 GNUNET_CONTAINER_DLL_remove (mq->envelope_head,
337 mq->envelope_tail,
338 ev);
339 }
330 mq->current_envelope = ev; 340 mq->current_envelope = ev;
331 341
332 LOG (GNUNET_ERROR_TYPE_DEBUG, 342 LOG (GNUNET_ERROR_TYPE_DEBUG,
@@ -344,6 +354,9 @@ GNUNET_MQ_send (struct GNUNET_MQ_Handle *mq,
344struct GNUNET_MQ_Envelope * 354struct GNUNET_MQ_Envelope *
345GNUNET_MQ_unsent_head (struct GNUNET_MQ_Handle *mq) 355GNUNET_MQ_unsent_head (struct GNUNET_MQ_Handle *mq)
346{ 356{
357 GNUNET_assert (0 < mq->queue_length);
358 GNUNET_assert (NULL != mq->envelope_head);
359 GNUNET_assert (NULL != mq->envelope_tail);
347 struct GNUNET_MQ_Envelope *env; 360 struct GNUNET_MQ_Envelope *env;
348 361
349 env = mq->envelope_head; 362 env = mq->envelope_head;
@@ -371,6 +384,7 @@ void
371GNUNET_MQ_send_copy (struct GNUNET_MQ_Handle *mq, 384GNUNET_MQ_send_copy (struct GNUNET_MQ_Handle *mq,
372 const struct GNUNET_MQ_Envelope *ev) 385 const struct GNUNET_MQ_Envelope *ev)
373{ 386{
387 GNUNET_assert (NULL != ev);
374 struct GNUNET_MQ_Envelope *env; 388 struct GNUNET_MQ_Envelope *env;
375 uint16_t msize; 389 uint16_t msize;
376 390
@@ -395,6 +409,7 @@ static void
395impl_send_continue (void *cls) 409impl_send_continue (void *cls)
396{ 410{
397 struct GNUNET_MQ_Handle *mq = cls; 411 struct GNUNET_MQ_Handle *mq = cls;
412 GNUNET_assert (NULL != mq->send_task);
398 413
399 mq->send_task = NULL; 414 mq->send_task = NULL;
400 /* call is only valid if we're actually currently sending 415 /* call is only valid if we're actually currently sending
@@ -428,6 +443,7 @@ GNUNET_MQ_impl_send_continue (struct GNUNET_MQ_Handle *mq)
428 mq->queue_length--; 443 mq->queue_length--;
429 mq->in_flight = false; 444 mq->in_flight = false;
430 current_envelope = mq->current_envelope; 445 current_envelope = mq->current_envelope;
446 GNUNET_assert (NULL != current_envelope);
431 current_envelope->parent_queue = NULL; 447 current_envelope->parent_queue = NULL;
432 mq->current_envelope = NULL; 448 mq->current_envelope = NULL;
433 GNUNET_assert (NULL == mq->send_task); 449 GNUNET_assert (NULL == mq->send_task);