27 #include <sys/epoll.h>
31 #define __SPE_EVENT_ALL \
32 ( SPE_EVENT_OUT_INTR_MBOX | SPE_EVENT_IN_MBOX | \
33 SPE_EVENT_TAG_GROUP | SPE_EVENT_SPE_STOPPED )
35 #define __SPE_EPOLL_SIZE 10
37 #define __SPE_EPOLL_FD_GET(handler) (*(int*)(handler))
38 #define __SPE_EPOLL_FD_SET(handler, fd) (*(int*)(handler) = (fd))
40 #define __SPE_EVENT_CONTEXT_PRIV_GET(spe) \
41 ( (spe_context_event_priv_ptr_t)(spe)->event_private)
42 #define __SPE_EVENT_CONTEXT_PRIV_SET(spe, evctx) \
43 ( (spe)->event_private = (evctx) )
45 #define __SPE_EVENTS_ENABLED(spe) \
46 ((spe)->base_private->flags & SPE_EVENTS_ENABLE)
71 rc = read(fd, stopinfo,
sizeof(*stopinfo));
78 while (total <
sizeof(*stopinfo)) {
82 rc = poll(&fds, 1, -1);
89 rc = read(fd, (
char *)stopinfo + total,
sizeof(*stopinfo) - total);
91 if (errno != EAGAIN) {
103 return rc == -1 ? -1 : 0;
115 evhandler = calloc(1,
sizeof(*evhandler));
158 const int ep_op = EPOLL_CTL_ADD;
161 struct epoll_event ep_event;
168 if (!event || !event->
spe) {
196 ev_buf->
data =
event->data;
198 ep_event.events = EPOLLIN;
199 ep_event.data.
ptr = ev_buf;
200 if (epoll_ctl(epfd, ep_op, fd, &ep_event) == -1) {
215 ev_buf->
data =
event->data;
217 ep_event.events = EPOLLOUT;
218 ep_event.data.
ptr = ev_buf;
219 if (epoll_ctl(epfd, ep_op, fd, &ep_event) == -1) {
240 ev_buf->
data =
event->data;
242 ep_event.events = EPOLLIN;
243 ep_event.data.
ptr = ev_buf;
244 if (epoll_ctl(epfd, ep_op, fd, &ep_event) == -1) {
255 ev_buf->
data =
event->data;
257 ep_event.events = EPOLLIN;
258 ep_event.data.
ptr = ev_buf;
259 if (epoll_ctl(epfd, ep_op, fd, &ep_event) == -1) {
276 const int ep_op = EPOLL_CTL_DEL;
284 if (!event || !event->
spe) {
309 if (epoll_ctl(epfd, ep_op, fd, NULL) == -1) {
322 if (epoll_ctl(epfd, ep_op, fd, NULL) == -1) {
335 if (epoll_ctl(epfd, ep_op, fd, NULL) == -1) {
344 if (epoll_ctl(epfd, ep_op, fd, NULL) == -1) {
363 struct epoll_event *ep_events;
370 if (!events || max_events <= 0) {
377 ep_events = malloc(
sizeof(*ep_events) * max_events);
383 rc = epoll_wait(epfd, ep_events, max_events, timeout);
385 if (errno == EINTR) {
398 for (i = 0; i < rc; i++) {
431 pthread_mutex_destroy(&evctx->
lock);
445 evctx = calloc(1,
sizeof(*evctx));
467 for (i = 0; i <
sizeof(evctx->
events) /
sizeof(evctx->
events[0]); i++) {
471 pthread_mutex_init(&evctx->
lock, NULL);
484 stopinfo = &stopinfo_buf;
489 if (write(evctx->
stop_event_pipe[1], stopinfo,
sizeof(*stopinfo)) !=
sizeof(*stopinfo)) {
void * spe_event_handler_ptr_t
#define SPE_EVENT_IN_MBOX
spe_event_unit_t events[__NUM_SPE_EVENT_TYPES]
#define __SPE_EVENTS_ENABLED(spe)
int _event_spe_event_handler_destroy(spe_event_handler_ptr_t evhandler)
int _base_spe_context_run(spe_context_ptr_t spe, unsigned int *entry, unsigned int runflags, void *argp, void *envp, spe_stop_info_t *stopinfo)
#define __SPE_EVENT_CONTEXT_PRIV_SET(spe, evctx)
int _event_spe_context_run(spe_context_ptr_t spe, unsigned int *entry, unsigned int runflags, void *argp, void *envp, spe_stop_info_t *stopinfo)
int _event_spe_event_handler_deregister(spe_event_handler_ptr_t evhandler, spe_event_unit_t *event)
#define __SPE_EPOLL_FD_GET(handler)
int _event_spe_event_handler_register(spe_event_handler_ptr_t evhandler, spe_event_unit_t *event)
spe_event_handler_ptr_t _event_spe_event_handler_create(void)
void _event_spe_context_unlock(spe_context_ptr_t spe)
#define SPE_EVENT_TAG_GROUP
struct spe_context_base_priv * base_private
void _event_spe_context_lock(spe_context_ptr_t spe)
pthread_mutex_t stop_event_read_lock
#define SPE_EVENT_SPE_STOPPED
int __base_spe_event_source_acquire(spe_context_ptr_t spe, enum fd_name fdesc)
int _event_spe_context_finalize(spe_context_ptr_t spe)
#define __SPE_EVENT_CONTEXT_PRIV_GET(spe)
int _event_spe_event_wait(spe_event_handler_ptr_t evhandler, spe_event_unit_t *events, int max_events, int timeout)
#define __SPE_EPOLL_FD_SET(handler, fd)
int _event_spe_stop_info_read(spe_context_ptr_t spe, spe_stop_info_t *stopinfo)
struct spe_context_event_priv * _event_spe_context_initialize(spe_context_ptr_t spe)
#define SPE_EVENT_OUT_INTR_MBOX