From f978e4d6dea2958b449906e33fdb965ef5bc26d4 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Wed, 1 Mar 2023 22:50:56 +0100 Subject: [PATCH] Use VecDeque in aoa_hid Replace cbuf by VecDeque in aoa_hid --- app/src/usb/aoa_hid.c | 41 +++++++++++++++++++++++++++-------------- app/src/usb/aoa_hid.h | 4 ++-- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/app/src/usb/aoa_hid.c b/app/src/usb/aoa_hid.c index 0007169d..fb64e57c 100644 --- a/app/src/usb/aoa_hid.c +++ b/app/src/usb/aoa_hid.c @@ -14,6 +14,8 @@ #define DEFAULT_TIMEOUT 1000 +#define SC_HID_EVENT_QUEUE_MAX 64 + static void sc_hid_event_log(const struct sc_hid_event *event) { // HID Event: [00] FF FF FF FF... @@ -48,14 +50,20 @@ sc_hid_event_destroy(struct sc_hid_event *hid_event) { bool sc_aoa_init(struct sc_aoa *aoa, struct sc_usb *usb, struct sc_acksync *acksync) { - cbuf_init(&aoa->queue); + sc_vecdeque_init(&aoa->queue); + + if (!sc_vecdeque_reserve(&aoa->queue, SC_HID_EVENT_QUEUE_MAX)) { + return false; + } if (!sc_mutex_init(&aoa->mutex)) { + sc_vecdeque_destroy(&aoa->queue); return false; } if (!sc_cond_init(&aoa->event_cond)) { sc_mutex_destroy(&aoa->mutex); + sc_vecdeque_destroy(&aoa->queue); return false; } @@ -69,9 +77,10 @@ sc_aoa_init(struct sc_aoa *aoa, struct sc_usb *usb, void sc_aoa_destroy(struct sc_aoa *aoa) { // Destroy remaining events - struct sc_hid_event event; - while (cbuf_take(&aoa->queue, &event)) { - sc_hid_event_destroy(&event); + while (!sc_vecdeque_is_empty(&aoa->queue)) { + struct sc_hid_event *event = sc_vecdeque_popref(&aoa->queue); + assert(event); + sc_hid_event_destroy(event); } sc_cond_destroy(&aoa->event_cond); @@ -212,13 +221,19 @@ sc_aoa_push_hid_event(struct sc_aoa *aoa, const struct sc_hid_event *event) { } sc_mutex_lock(&aoa->mutex); - bool was_empty = cbuf_is_empty(&aoa->queue); - bool res = cbuf_push(&aoa->queue, *event); - if (was_empty) { - sc_cond_signal(&aoa->event_cond); + bool full = sc_vecdeque_is_full(&aoa->queue); + if (!full) { + bool was_empty = sc_vecdeque_is_empty(&aoa->queue); + sc_vecdeque_push_noresize(&aoa->queue, *event); + if (was_empty) { + sc_cond_signal(&aoa->event_cond); + } } + // Otherwise (if the queue is full), the event is discarded + sc_mutex_unlock(&aoa->mutex); - return res; + + return !full; } static int @@ -227,7 +242,7 @@ run_aoa_thread(void *data) { for (;;) { sc_mutex_lock(&aoa->mutex); - while (!aoa->stopped && cbuf_is_empty(&aoa->queue)) { + while (!aoa->stopped && sc_vecdeque_is_empty(&aoa->queue)) { sc_cond_wait(&aoa->event_cond, &aoa->mutex); } if (aoa->stopped) { @@ -235,11 +250,9 @@ run_aoa_thread(void *data) { sc_mutex_unlock(&aoa->mutex); break; } - struct sc_hid_event event; - bool non_empty = cbuf_take(&aoa->queue, &event); - assert(non_empty); - (void) non_empty; + assert(!sc_vecdeque_is_empty(&aoa->queue)); + struct sc_hid_event event = sc_vecdeque_pop(&aoa->queue); uint64_t ack_to_wait = event.ack_to_wait; sc_mutex_unlock(&aoa->mutex); diff --git a/app/src/usb/aoa_hid.h b/app/src/usb/aoa_hid.h index d785a0e9..8803c1d9 100644 --- a/app/src/usb/aoa_hid.h +++ b/app/src/usb/aoa_hid.h @@ -8,9 +8,9 @@ #include "usb.h" #include "util/acksync.h" -#include "util/cbuf.h" #include "util/thread.h" #include "util/tick.h" +#include "util/vecdeque.h" struct sc_hid_event { uint16_t accessory_id; @@ -27,7 +27,7 @@ sc_hid_event_init(struct sc_hid_event *hid_event, uint16_t accessory_id, void sc_hid_event_destroy(struct sc_hid_event *hid_event); -struct sc_hid_event_queue CBUF(struct sc_hid_event, 64); +struct sc_hid_event_queue SC_VECDEQUE(struct sc_hid_event); struct sc_aoa { struct sc_usb *usb;