From 443351e95ac0761438fe1658942b014a82dcfed4 Mon Sep 17 00:00:00 2001 From: "Sergio R. Caprile" Date: Wed, 7 Sep 2022 14:31:08 -0300 Subject: [PATCH 1/2] Make mip_test fail with current queue algo --- test/mip_test.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/mip_test.c b/test/mip_test.c index 2de65eb3..3bb05940 100644 --- a/test/mip_test.c +++ b/test/mip_test.c @@ -2,15 +2,17 @@ #include "mongoose.c" static void test_queue(void) { - uint8_t buf[sizeof(size_t) + 5]; + static uint8_t buf[sizeof(size_t) + sizeof(uint16_t) + 3 ]; // fit 1 element but not 2 uint16_t val = 1234; - struct queue q = {buf, sizeof(buf), 0, 0}; + static struct queue q = {buf, sizeof(buf), 0, 0}; // Write to an empty queue, and read back assert(q_avail(&q) == 0); assert(q_write(&q, &val, sizeof(val)) == true); assert(q_avail(&q) == sizeof(val)); assert(q.head > q.tail); + // Only one element may fit + assert(q_write(&q, &val, sizeof(val)) == false); val = 0; assert(q_read(&q, &val) == sizeof(val)); assert(val == 1234); @@ -20,6 +22,8 @@ static void test_queue(void) { assert(q_write(&q, &val, sizeof(val)) == true); assert(q_avail(&q) == sizeof(val)); assert(q.head < q.tail); + // Only one element may fit + assert(q_write(&q, &val, sizeof(val)) == false); val = 0; assert(q_read(&q, &val) == sizeof(val)); assert(val == 1234); From 9675bfe07d7ca6731c28b81e9c97a25921cb76de Mon Sep 17 00:00:00 2001 From: "Sergio R. Caprile" Date: Wed, 7 Sep 2022 10:14:33 -0300 Subject: [PATCH 2/2] Fix MIP Q --- mip/mip.c | 2 +- mongoose.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mip/mip.c b/mip/mip.c index 9b054c4b..33fd5408 100644 --- a/mip/mip.c +++ b/mip/mip.c @@ -180,7 +180,7 @@ static void q_copyout(struct queue *q, uint8_t *buf, size_t len, size_t tail) { static bool q_write(struct queue *q, const void *buf, size_t len) { bool success = false; - size_t left = q->len - q->head + q->tail; + size_t left = (q->len - q->head + q->tail -1) % q->len; if (len + sizeof(size_t) <= left) { q_copyin(q, (uint8_t *) &len, sizeof(len), q->head); q_copyin(q, (uint8_t *) buf, len, (q->head + sizeof(size_t)) % q->len); diff --git a/mongoose.c b/mongoose.c index 65545fab..a9f15b6c 100644 --- a/mongoose.c +++ b/mongoose.c @@ -6469,7 +6469,7 @@ static void q_copyout(struct queue *q, uint8_t *buf, size_t len, size_t tail) { static bool q_write(struct queue *q, const void *buf, size_t len) { bool success = false; - size_t left = q->len - q->head + q->tail; + size_t left = (q->len - q->head + q->tail -1) % q->len; if (len + sizeof(size_t) <= left) { q_copyin(q, (uint8_t *) &len, sizeof(len), q->head); q_copyin(q, (uint8_t *) buf, len, (q->head + sizeof(size_t)) % q->len);