Small improvements in async
This commit is contained in:
		
							
								
								
									
										37
									
								
								src/async.c
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								src/async.c
									
									
									
									
									
								
							@@ -49,6 +49,13 @@ static short async_a2p(async_evt_t events) {
 | 
			
		||||
    if (events & ASYNC_IN)  ret |= POLLIN;
 | 
			
		||||
    if (events & ASYNC_PRI) ret |= POLLPRI;
 | 
			
		||||
    if (events & ASYNC_OUT) ret |= POLLOUT;
 | 
			
		||||
    if (events & ASYNC_ERR) ret |= POLLERR;
 | 
			
		||||
    if (events & ASYNC_HUP) ret |= POLLHUP;
 | 
			
		||||
    if (events & ASYNC_RDNORM) ret |= POLLRDNORM;
 | 
			
		||||
    if (events & ASYNC_RDBAND) ret |= POLLRDBAND;
 | 
			
		||||
    if (events & ASYNC_WRNORM) ret |= POLLWRNORM;
 | 
			
		||||
    if (events & ASYNC_WRBAND) ret |= POLLWRBAND;
 | 
			
		||||
    if (events & ASYNC_MSG) ret |= POLLMSG;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -57,6 +64,13 @@ static unsigned int async_a2e(async_evt_t events) {
 | 
			
		||||
    if (events & ASYNC_IN)  ret |= EPOLLIN;
 | 
			
		||||
    if (events & ASYNC_PRI) ret |= EPOLLPRI;
 | 
			
		||||
    if (events & ASYNC_OUT) ret |= EPOLLOUT;
 | 
			
		||||
    if (events & ASYNC_ERR) ret |= EPOLLERR;
 | 
			
		||||
    if (events & ASYNC_HUP) ret |= EPOLLHUP;
 | 
			
		||||
    if (events & ASYNC_RDNORM) ret |= EPOLLRDNORM;
 | 
			
		||||
    if (events & ASYNC_RDBAND) ret |= EPOLLRDBAND;
 | 
			
		||||
    if (events & ASYNC_WRNORM) ret |= EPOLLWRNORM;
 | 
			
		||||
    if (events & ASYNC_WRBAND) ret |= EPOLLWRBAND;
 | 
			
		||||
    if (events & ASYNC_MSG) ret |= EPOLLMSG;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -67,6 +81,11 @@ static async_evt_t async_p2a(short events) {
 | 
			
		||||
    if (events & POLLOUT)  ret |= ASYNC_OUT;
 | 
			
		||||
    if (events & POLLERR)  ret |= ASYNC_ERR;
 | 
			
		||||
    if (events & POLLHUP)  ret |= ASYNC_HUP;
 | 
			
		||||
    if (events & POLLRDNORM) ret |= ASYNC_RDNORM;
 | 
			
		||||
    if (events & POLLRDBAND) ret |= ASYNC_RDBAND;
 | 
			
		||||
    if (events & POLLWRNORM) ret |= ASYNC_WRNORM;
 | 
			
		||||
    if (events & POLLWRBAND) ret |= ASYNC_WRBAND;
 | 
			
		||||
    if (events & POLLMSG) ret |= ASYNC_MSG;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -77,9 +96,22 @@ static async_evt_t async_e2a(unsigned int events) {
 | 
			
		||||
    if (events & EPOLLOUT)  ret |= ASYNC_OUT;
 | 
			
		||||
    if (events & EPOLLERR)  ret |= ASYNC_ERR;
 | 
			
		||||
    if (events & EPOLLHUP)  ret |= ASYNC_HUP;
 | 
			
		||||
    if (events & EPOLLRDNORM) ret |= ASYNC_RDNORM;
 | 
			
		||||
    if (events & EPOLLRDBAND) ret |= ASYNC_RDBAND;
 | 
			
		||||
    if (events & EPOLLWRNORM) ret |= ASYNC_WRNORM;
 | 
			
		||||
    if (events & EPOLLWRBAND) ret |= ASYNC_WRBAND;
 | 
			
		||||
    if (events & EPOLLMSG) ret |= ASYNC_MSG;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static short async_e2p(unsigned int events) {
 | 
			
		||||
    return async_a2p(async_e2a(events));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static unsigned int async_p2e(short events) {
 | 
			
		||||
    return async_a2e(async_p2a(events));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int async_add_to_queue(evt_listen_t *evt) {
 | 
			
		||||
    while (sem_wait(&lock) != 0) {
 | 
			
		||||
        if (errno == EINTR) {
 | 
			
		||||
@@ -246,11 +278,13 @@ void async_thread(void) {
 | 
			
		||||
            while (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, evt->fd, &ev) == -1) {
 | 
			
		||||
                if (errno == EEXIST) {
 | 
			
		||||
                    // fd already exists, delete old one
 | 
			
		||||
                    warning("Unable to add file descriptor to epoll instance");
 | 
			
		||||
                    errno = 0;
 | 
			
		||||
                    if (epoll_ctl(epoll_fd, EPOLL_CTL_DEL, evt->fd, NULL) != -1)
 | 
			
		||||
                        continue;
 | 
			
		||||
                } else if (errno == EBADF) {
 | 
			
		||||
                    // fd probably already closed
 | 
			
		||||
                    warning("Unable to add file descriptor to epoll instance");
 | 
			
		||||
                    errno = 0;
 | 
			
		||||
                    local = list_delete(local, &evt);
 | 
			
		||||
                    if (local == NULL) {
 | 
			
		||||
@@ -277,6 +311,7 @@ void async_thread(void) {
 | 
			
		||||
            if (min_ts == -1000 || ts < min_ts) min_ts = ts;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 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 (errno == EINTR) {
 | 
			
		||||
                // interrupt
 | 
			
		||||
@@ -298,6 +333,7 @@ void async_thread(void) {
 | 
			
		||||
                if (epoll_ctl(epoll_fd, EPOLL_CTL_DEL, evt->fd, NULL) == -1) {
 | 
			
		||||
                    if (errno == EBADF || errno == ENOENT) {
 | 
			
		||||
                        // already closed fd or not found, do not die
 | 
			
		||||
                        warning("Unable to remove file descriptor from epoll instance");
 | 
			
		||||
                        errno = 0;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        critical("Unable to remove file descriptor from epoll instance");
 | 
			
		||||
@@ -328,6 +364,7 @@ void async_thread(void) {
 | 
			
		||||
                if (epoll_ctl(epoll_fd, EPOLL_CTL_DEL, evt->fd, NULL) == -1) {
 | 
			
		||||
                    if (errno == EBADF || errno == ENOENT) {
 | 
			
		||||
                        // already closed fd or not found, do not die
 | 
			
		||||
                        critical("Unable to remove file descriptor from epoll instance");
 | 
			
		||||
                        errno = 0;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        critical("Unable to remove file descriptor from epoll instance");
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								src/async.h
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								src/async.h
									
									
									
									
									
								
							@@ -14,11 +14,16 @@
 | 
			
		||||
#define ASYNC_KEEP 1
 | 
			
		||||
#define ASYNC_IGNORE_PENDING 2
 | 
			
		||||
 | 
			
		||||
#define ASYNC_IN   0x01
 | 
			
		||||
#define ASYNC_PRI  0x02
 | 
			
		||||
#define ASYNC_OUT  0x04
 | 
			
		||||
#define ASYNC_ERR  0x08
 | 
			
		||||
#define ASYNC_HUP  0x10
 | 
			
		||||
#define ASYNC_IN     0x001
 | 
			
		||||
#define ASYNC_PRI    0x002
 | 
			
		||||
#define ASYNC_OUT    0x004
 | 
			
		||||
#define ASYNC_ERR    0x008
 | 
			
		||||
#define ASYNC_HUP    0x010
 | 
			
		||||
#define ASYNC_RDNORM 0x040
 | 
			
		||||
#define ASYNC_RDBAND 0x080
 | 
			
		||||
#define ASYNC_WRNORM 0x100
 | 
			
		||||
#define ASYNC_WRBAND 0x200
 | 
			
		||||
#define ASYNC_MSG    0x400
 | 
			
		||||
 | 
			
		||||
#define ASYNC_WAIT_READ  ASYNC_IN
 | 
			
		||||
#define ASYNC_WAIT_WRITE ASYNC_OUT
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user