Async: lock queue and make volatile
This commit is contained in:
14
src/async.c
14
src/async.c
@ -38,7 +38,7 @@ typedef struct {
|
|||||||
evt_listen_t *q[ASYNC_MAX_EVENTS];
|
evt_listen_t *q[ASYNC_MAX_EVENTS];
|
||||||
} listen_queue_t;
|
} listen_queue_t;
|
||||||
|
|
||||||
static listen_queue_t listen1, listen2, *listen_q = &listen1;
|
static volatile listen_queue_t listen1, listen2, *listen_q = &listen1;
|
||||||
static volatile sig_atomic_t alive = 1;
|
static volatile sig_atomic_t alive = 1;
|
||||||
static pthread_t thread = -1;
|
static pthread_t thread = -1;
|
||||||
static sem_t lock;
|
static sem_t lock;
|
||||||
@ -247,7 +247,7 @@ void async_thread(void) {
|
|||||||
struct epoll_event ev, events[ASYNC_MAX_EVENTS];
|
struct epoll_event ev, events[ASYNC_MAX_EVENTS];
|
||||||
int num_fds;
|
int num_fds;
|
||||||
long ts, min_ts, cur_ts;
|
long ts, min_ts, cur_ts;
|
||||||
listen_queue_t *l;
|
volatile listen_queue_t *l;
|
||||||
evt_listen_t **local;
|
evt_listen_t **local;
|
||||||
|
|
||||||
if ((local = list_create(sizeof(evt_listen_t *), 16)) == NULL) {
|
if ((local = list_create(sizeof(evt_listen_t *), 16)) == NULL) {
|
||||||
@ -260,8 +260,18 @@ void async_thread(void) {
|
|||||||
// main event loop
|
// main event loop
|
||||||
while (alive) {
|
while (alive) {
|
||||||
// swap listen queue
|
// swap listen queue
|
||||||
|
while (sem_wait(&lock) != 0) {
|
||||||
|
if (errno == EINTR) {
|
||||||
|
errno = 0;
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
critical("Unable to lock async queue");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
l = listen_q;
|
l = listen_q;
|
||||||
listen_q = (listen_q == &listen1) ? &listen2 : &listen1;
|
listen_q = (listen_q == &listen1) ? &listen2 : &listen1;
|
||||||
|
sem_post(&lock);
|
||||||
|
|
||||||
// fill local list and epoll instance with previously added queue entries
|
// fill local list and epoll instance with previously added queue entries
|
||||||
for (int i = 0; i < l->n; i++) {
|
for (int i = 0; i < l->n; i++) {
|
||||||
|
Reference in New Issue
Block a user