diff options
author | Igor Sysoev <igor@sysoev.ru> | 2017-02-07 20:04:56 +0300 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2017-02-07 20:04:56 +0300 |
commit | 059a8642898a6bd4b47d13a1c1d599cd44af7e1c (patch) | |
tree | e3c8c530a04f1ae44777d5ea4fd6901dc55a8ebf /src/nxt_fd_event.h | |
parent | e57b95a92333fa7ff558737b0ba2b76894cc0412 (diff) | |
download | unit-059a8642898a6bd4b47d13a1c1d599cd44af7e1c.tar.gz unit-059a8642898a6bd4b47d13a1c1d599cd44af7e1c.tar.bz2 |
Event engines refactoring.
Diffstat (limited to 'src/nxt_fd_event.h')
-rw-r--r-- | src/nxt_fd_event.h | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/nxt_fd_event.h b/src/nxt_fd_event.h new file mode 100644 index 00000000..ff989394 --- /dev/null +++ b/src/nxt_fd_event.h @@ -0,0 +1,122 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) NGINX, Inc. + */ + +#ifndef _NXT_FD_EVENT_H_INCLUDED_ +#define _NXT_FD_EVENT_H_INCLUDED_ + + +typedef enum { + /* A completely inactive event. */ + NXT_EVENT_INACTIVE = 0, + + /* + * An event presents in the kernel but disabled after oneshot. + * Used by epoll. + */ + NXT_EVENT_DISABLED, + + /* + * An event is active in the kernel but blocked by application. + * Used by kqueue, epoll, eventport, devpoll, and pollset. + */ + NXT_EVENT_BLOCKED, + + /* + * An active oneshot event. + * Used by epoll, devpoll, pollset, poll, and select. + */ + NXT_EVENT_ONESHOT, + + /* An active level-triggered event. Used by eventport. */ + NXT_EVENT_LEVEL, + + /* + * An active default event. The event type depends on interface: + * edge-triggered for kqueue, and modern epoll; + * level-triggered for old epoll, devpoll, pollset, poll, and select; + * oneshot for kqueue and eventport. + */ + NXT_EVENT_DEFAULT, + NXT_EVENT_ACTIVE = NXT_EVENT_DEFAULT, +} nxt_fd_event_state_t; + + +#define \ +nxt_fd_event_is_disabled(state) \ + ((state) < NXT_EVENT_ONESHOT) + + +#define \ +nxt_fd_event_is_active(state) \ + ((state) >= NXT_EVENT_ONESHOT) + + +struct nxt_fd_event_s { + void *data; + + /* Both are int's. */ + nxt_socket_t fd; + nxt_err_t error; + + /* The flags should also be prefetched by nxt_work_queue_pop(). */ + +#if (NXT_64BIT) + nxt_fd_event_state_t read:8; /* 3 bits. */ + nxt_fd_event_state_t write:8; /* 3 bits. */ + nxt_socket_error_level_t log_error:8; /* 3 bits. */ + uint8_t read_ready; + uint8_t write_ready; + uint8_t changing; + uint8_t closed; + uint8_t shutdown; + uint8_t timedout; +#if (NXT_HAVE_EPOLL) + uint8_t epoll_eof:1; + uint8_t epoll_error:1; +#endif +#if (NXT_HAVE_KQUEUE) + uint8_t kq_eof; +#endif + +#else /* NXT_32BIT */ + nxt_fd_event_state_t read:3; + nxt_fd_event_state_t write:3; + nxt_socket_error_level_t log_error:3; + uint8_t read_ready:1; + uint8_t write_ready:1; + uint8_t changing:1; + uint8_t closed:1; + uint8_t shutdown:1; + uint8_t timedout:1; +#if (NXT_HAVE_EPOLL) + uint8_t epoll_eof:1; + uint8_t epoll_error:1; +#endif +#if (NXT_HAVE_KQUEUE) + uint8_t kq_eof:1; +#endif +#endif /* NXT_64BIT */ + +#if (NXT_HAVE_KQUEUE) + /* nxt_err_t is int. */ + nxt_err_t kq_errno; + /* struct kevent.data is intptr_t, however int32_t is enough. */ + int32_t kq_available; +#endif + + nxt_task_t *task; + + nxt_work_queue_t *read_work_queue; + nxt_work_handler_t read_handler; + nxt_work_queue_t *write_work_queue; + nxt_work_handler_t write_handler; + nxt_work_handler_t error_handler; + + nxt_log_t *log; +}; + + +#endif /* _NXT_FD_EVENT_H_INCLUDED_ */ |