diff --git a/tools/acrn-crashlog/acrnprobe/event_queue.c b/tools/acrn-crashlog/acrnprobe/event_queue.c index 51c097e2f5..3288bdc8c2 100644 --- a/tools/acrn-crashlog/acrnprobe/event_queue.c +++ b/tools/acrn-crashlog/acrnprobe/event_queue.c @@ -3,8 +3,73 @@ * SPDX-License-Identifier: BSD-3-Clause */ +#include +#include +#include #include "event_queue.h" +#include "log_sys.h" -void init_event(void) +static pthread_mutex_t eq_mtx = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t pcond = PTHREAD_COND_INITIALIZER; +TAILQ_HEAD(, event_t) event_q; + +/** + * Enqueue an event to event_queue. + * + * @param event Event to process. + */ +void event_enqueue(struct event_t *event) +{ + pthread_mutex_lock(&eq_mtx); + TAILQ_INSERT_TAIL(&event_q, event, entries); + pthread_cond_signal(&pcond); + LOGD("enqueue %d, (%d)%s\n", event->event_type, event->len, + event->path); + pthread_mutex_unlock(&eq_mtx); +} + +/** + * Count the number of events in event_queue. + * + * @return count. + */ +int events_count(void) +{ + struct event_t *e; + int count = 0; + + pthread_mutex_lock(&eq_mtx); + TAILQ_FOREACH(e, &event_q, entries) + count++; + pthread_mutex_unlock(&eq_mtx); + + return count; +} + +/** + * Dequeue an event from event_queue. + * + * @return the dequeued event. + */ +struct event_t *event_dequeue(void) +{ + struct event_t *e; + + pthread_mutex_lock(&eq_mtx); + while (TAILQ_EMPTY(&event_q)) + pthread_cond_wait(&pcond, &eq_mtx); + e = TAILQ_FIRST(&event_q); + TAILQ_REMOVE(&event_q, e, entries); + LOGD("dequeue %d, (%d)%s\n", e->event_type, e->len, e->path); + pthread_mutex_unlock(&eq_mtx); + + return e; +} + +/** + * Initailize event_queue. + */ +void init_event_queue(void) { + TAILQ_INIT(&event_q); } diff --git a/tools/acrn-crashlog/acrnprobe/include/event_queue.h b/tools/acrn-crashlog/acrnprobe/include/event_queue.h index 48dce43474..512668855b 100644 --- a/tools/acrn-crashlog/acrnprobe/include/event_queue.h +++ b/tools/acrn-crashlog/acrnprobe/include/event_queue.h @@ -33,6 +33,9 @@ struct event_t { char path[0]; /* keep this at tail*/ }; +void event_enqueue(struct event_t *event); +int events_count(void); +struct event_t *event_dequeue(void); void init_event_queue(void); #endif