diff options
author | Jacki <jacki@thejackimonster.de> | 2024-07-09 00:07:19 +0200 |
---|---|---|
committer | Jacki <jacki@thejackimonster.de> | 2024-07-09 00:07:19 +0200 |
commit | cc17efdd940dc6abad29e51765d2fbf44953afdd (patch) | |
tree | c668d6d534f3156f2ff4841ee9ed5e347dd7a9d9 | |
parent | 9f7d0a0e84dbf11e2ec169bb2d05d720e4017324 (diff) | |
download | gnunet-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.c | 22 |
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, | |||
344 | struct GNUNET_MQ_Envelope * | 354 | struct GNUNET_MQ_Envelope * |
345 | GNUNET_MQ_unsent_head (struct GNUNET_MQ_Handle *mq) | 355 | GNUNET_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 | |||
371 | GNUNET_MQ_send_copy (struct GNUNET_MQ_Handle *mq, | 384 | GNUNET_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 | |||
395 | impl_send_continue (void *cls) | 409 | impl_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); |