mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-21 13:08:42 +00:00
tools: acrn-crashlog: event queue operations for acrnprobe
There is a global queue to receive all events detected. Genarally, events are enqueued in channel, and dequeued in event handler. Signed-off-by: Liu Xinwu <xinwu.liu@intel.com> Reviewed-by: Zhang Yanmin <yanmin.zhang@intel.com> Reviewed-by: Liu Chuansheng <chuansheng.liu@intel.com> Reviewed-by: Zhao Yakui <yakui.zhao@intel.com> Reviewed-by: Geoffroy Van Cutsem <geoffroy.vancutsem@intel.com> Acked-by: Eddie Dong <Eddie.dong@intel.com>
This commit is contained in:
parent
a35ef1aa90
commit
bc18f1d65f
@ -3,8 +3,73 @@
|
|||||||
* SPDX-License-Identifier: BSD-3-Clause
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/queue.h>
|
||||||
|
#include <pthread.h>
|
||||||
#include "event_queue.h"
|
#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);
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,9 @@ struct event_t {
|
|||||||
char path[0]; /* keep this at tail*/
|
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);
|
void init_event_queue(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user