async: Warn when queue is full
This commit is contained in:
+17
-7
@@ -21,7 +21,8 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <openssl/ssl.h>
|
#include <openssl/ssl.h>
|
||||||
|
|
||||||
#define ASYNC_MAX_EVENTS 16
|
#define ASYNC_QUEUE_MAX_EVENTS 256
|
||||||
|
#define ASYNC_EPOLL_MAX_EVENTS 64
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int fd;
|
int fd;
|
||||||
@@ -36,7 +37,7 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int n;
|
int n;
|
||||||
evt_listen_t *q[ASYNC_MAX_EVENTS];
|
evt_listen_t *q[ASYNC_QUEUE_MAX_EVENTS];
|
||||||
} listen_queue_t;
|
} listen_queue_t;
|
||||||
|
|
||||||
static volatile listen_queue_t listen1, listen2, *listen_q = &listen1;
|
static volatile listen_queue_t listen1, listen2, *listen_q = &listen1;
|
||||||
@@ -123,7 +124,13 @@ static int async_add_to_queue(evt_listen_t *evt) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
evt_listen_t *ptr = malloc(sizeof(evt_listen_t));
|
if (listen_q->n >= ASYNC_QUEUE_MAX_EVENTS) {
|
||||||
|
sem_post(&lock);
|
||||||
|
errno = ENOBUFS;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
evt_listen_t *ptr = malloc(sizeof(*evt));
|
||||||
if (ptr == NULL) {
|
if (ptr == NULL) {
|
||||||
sem_post(&lock);
|
sem_post(&lock);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -198,9 +205,12 @@ static int async_add(evt_listen_t *evt) {
|
|||||||
if (async_check(evt) == 1)
|
if (async_check(evt) == 1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
int ret = async_add_to_queue(evt);
|
int ret;
|
||||||
if (ret == 0 && thread != -1)
|
if ((ret = async_add_to_queue(evt)) != 0) {
|
||||||
|
alert("Unable to add event to async queue");
|
||||||
|
} else if (thread != -1) {
|
||||||
pthread_kill(thread, SIGUSR1);
|
pthread_kill(thread, SIGUSR1);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -257,7 +267,7 @@ void async_free(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void async_thread(void) {
|
void async_thread(void) {
|
||||||
struct epoll_event ev, events[ASYNC_MAX_EVENTS];
|
struct epoll_event ev, events[ASYNC_EPOLL_MAX_EVENTS];
|
||||||
int num_fds, idx;
|
int num_fds, idx;
|
||||||
long ts, min_ts, cur_ts;
|
long ts, min_ts, cur_ts;
|
||||||
volatile listen_queue_t *l;
|
volatile listen_queue_t *l;
|
||||||
@@ -343,7 +353,7 @@ void async_thread(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// epoll is used in level-triggered mode, so buffers are taken into account
|
// epoll is used in level-triggered mode, so buffers are taken into account
|
||||||
if ((num_fds = epoll_wait(epoll_fd, events, ASYNC_MAX_EVENTS, (int) (min_ts / 1000))) == -1) {
|
if ((num_fds = epoll_wait(epoll_fd, events, ASYNC_EPOLL_MAX_EVENTS, (int) (min_ts / 1000))) == -1) {
|
||||||
if (errno == EINTR) {
|
if (errno == EINTR) {
|
||||||
// interrupt
|
// interrupt
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user