From b28c51d594ba3147bc1c30c34b974beb3f1fdfb3 Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Wed, 21 Nov 2012 16:46:29 +0000 Subject: [PATCH] opr: Don't confuse isLast and isEnd opr_queue_IsEnd's implementation was incorrect - it would return true when the element was the last item in the list, not when it was the end of the list (equal to the head record) Correct the implementation of isEnd, and add an implementation for isLast. This fixes a bug in RX, wher we would never notice that the last packet in the transmit queue was acknowledged, because the loop that iterates over the queue uses isEnd to detect when its work is done. Change-Id: I8966e05c479c18d025bb5cc4cf77514ce002be95 Reviewed-on: http://gerrit.openafs.org/8493 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Reviewed-by: Derrick Brashear --- src/opr/queue.h | 5 +++++ tests/opr/queues-t.c | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/opr/queue.h b/src/opr/queue.h index dd45f68..e31c902 100644 --- a/src/opr/queue.h +++ b/src/opr/queue.h @@ -124,6 +124,11 @@ opr_queue_IsOnQueue(struct opr_queue *q) { static_inline int opr_queue_IsEnd(struct opr_queue *q, struct opr_queue *cursor) { + return (cursor == q); +} + +static_inline int +opr_queue_IsLast(struct opr_queue *q, struct opr_queue *cursor) { return (cursor->next == q); } diff --git a/tests/opr/queues-t.c b/tests/opr/queues-t.c index 257e519..df43f5d 100644 --- a/tests/opr/queues-t.c +++ b/tests/opr/queues-t.c @@ -57,7 +57,7 @@ main(void) { struct opr_queue q1, q2, q3, q4, *cursor; - plan(17); + plan(20); opr_queue_Init(&q1); opr_queue_Init(&q2); @@ -136,5 +136,13 @@ main(void) is_string("ABC", queueAsString(&q3), "Swap Q3"); is_string("123", queueAsString(&q4), "Swap Q4"); + /* IsEnd and IsLast handling */ + ok(opr_queue_IsLast(&q1, &(opr_queue_Last(&q1, struct charqueue, entry)->entry)), + "IsLast is true for last element of a list"); + ok(opr_queue_IsEnd(&q1, + opr_queue_Last(&q1, struct charqueue, entry)->entry.next), + "IsEnd is true for entry after last element"); + ok(opr_queue_IsEnd(&q1, &q1), "IsEnd is true for queue head"); + return 0; } -- 1.9.4