Use VecDeque in aoa_hid
Replace cbuf by VecDeque in aoa_hid
This commit is contained in:
parent
a0a65b3c4d
commit
f978e4d6de
2 changed files with 29 additions and 16 deletions
|
@ -14,6 +14,8 @@
|
||||||
|
|
||||||
#define DEFAULT_TIMEOUT 1000
|
#define DEFAULT_TIMEOUT 1000
|
||||||
|
|
||||||
|
#define SC_HID_EVENT_QUEUE_MAX 64
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sc_hid_event_log(const struct sc_hid_event *event) {
|
sc_hid_event_log(const struct sc_hid_event *event) {
|
||||||
// HID Event: [00] FF FF FF FF...
|
// HID Event: [00] FF FF FF FF...
|
||||||
|
@ -48,14 +50,20 @@ sc_hid_event_destroy(struct sc_hid_event *hid_event) {
|
||||||
bool
|
bool
|
||||||
sc_aoa_init(struct sc_aoa *aoa, struct sc_usb *usb,
|
sc_aoa_init(struct sc_aoa *aoa, struct sc_usb *usb,
|
||||||
struct sc_acksync *acksync) {
|
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)) {
|
if (!sc_mutex_init(&aoa->mutex)) {
|
||||||
|
sc_vecdeque_destroy(&aoa->queue);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sc_cond_init(&aoa->event_cond)) {
|
if (!sc_cond_init(&aoa->event_cond)) {
|
||||||
sc_mutex_destroy(&aoa->mutex);
|
sc_mutex_destroy(&aoa->mutex);
|
||||||
|
sc_vecdeque_destroy(&aoa->queue);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,9 +77,10 @@ sc_aoa_init(struct sc_aoa *aoa, struct sc_usb *usb,
|
||||||
void
|
void
|
||||||
sc_aoa_destroy(struct sc_aoa *aoa) {
|
sc_aoa_destroy(struct sc_aoa *aoa) {
|
||||||
// Destroy remaining events
|
// Destroy remaining events
|
||||||
struct sc_hid_event event;
|
while (!sc_vecdeque_is_empty(&aoa->queue)) {
|
||||||
while (cbuf_take(&aoa->queue, &event)) {
|
struct sc_hid_event *event = sc_vecdeque_popref(&aoa->queue);
|
||||||
sc_hid_event_destroy(&event);
|
assert(event);
|
||||||
|
sc_hid_event_destroy(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
sc_cond_destroy(&aoa->event_cond);
|
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);
|
sc_mutex_lock(&aoa->mutex);
|
||||||
bool was_empty = cbuf_is_empty(&aoa->queue);
|
bool full = sc_vecdeque_is_full(&aoa->queue);
|
||||||
bool res = cbuf_push(&aoa->queue, *event);
|
if (!full) {
|
||||||
if (was_empty) {
|
bool was_empty = sc_vecdeque_is_empty(&aoa->queue);
|
||||||
sc_cond_signal(&aoa->event_cond);
|
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);
|
sc_mutex_unlock(&aoa->mutex);
|
||||||
return res;
|
|
||||||
|
return !full;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -227,7 +242,7 @@ run_aoa_thread(void *data) {
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
sc_mutex_lock(&aoa->mutex);
|
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);
|
sc_cond_wait(&aoa->event_cond, &aoa->mutex);
|
||||||
}
|
}
|
||||||
if (aoa->stopped) {
|
if (aoa->stopped) {
|
||||||
|
@ -235,11 +250,9 @@ run_aoa_thread(void *data) {
|
||||||
sc_mutex_unlock(&aoa->mutex);
|
sc_mutex_unlock(&aoa->mutex);
|
||||||
break;
|
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;
|
uint64_t ack_to_wait = event.ack_to_wait;
|
||||||
sc_mutex_unlock(&aoa->mutex);
|
sc_mutex_unlock(&aoa->mutex);
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,9 @@
|
||||||
|
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "util/acksync.h"
|
#include "util/acksync.h"
|
||||||
#include "util/cbuf.h"
|
|
||||||
#include "util/thread.h"
|
#include "util/thread.h"
|
||||||
#include "util/tick.h"
|
#include "util/tick.h"
|
||||||
|
#include "util/vecdeque.h"
|
||||||
|
|
||||||
struct sc_hid_event {
|
struct sc_hid_event {
|
||||||
uint16_t accessory_id;
|
uint16_t accessory_id;
|
||||||
|
@ -27,7 +27,7 @@ sc_hid_event_init(struct sc_hid_event *hid_event, uint16_t accessory_id,
|
||||||
void
|
void
|
||||||
sc_hid_event_destroy(struct sc_hid_event *hid_event);
|
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_aoa {
|
||||||
struct sc_usb *usb;
|
struct sc_usb *usb;
|
||||||
|
|
Loading…
Reference in a new issue