112Sigor@sysoev.ru 212Sigor@sysoev.ru /* 312Sigor@sysoev.ru * Copyright (C) Igor Sysoev 412Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 512Sigor@sysoev.ru */ 612Sigor@sysoev.ru 712Sigor@sysoev.ru #ifndef _NXT_FD_EVENT_H_INCLUDED_ 812Sigor@sysoev.ru #define _NXT_FD_EVENT_H_INCLUDED_ 912Sigor@sysoev.ru 1012Sigor@sysoev.ru 1112Sigor@sysoev.ru typedef enum { 1212Sigor@sysoev.ru /* A completely inactive event. */ 1312Sigor@sysoev.ru NXT_EVENT_INACTIVE = 0, 1412Sigor@sysoev.ru 1512Sigor@sysoev.ru /* 1612Sigor@sysoev.ru * An event presents in the kernel but disabled after oneshot. 1712Sigor@sysoev.ru * Used by epoll. 1812Sigor@sysoev.ru */ 1912Sigor@sysoev.ru NXT_EVENT_DISABLED, 2012Sigor@sysoev.ru 2112Sigor@sysoev.ru /* 2212Sigor@sysoev.ru * An event is active in the kernel but blocked by application. 2312Sigor@sysoev.ru * Used by kqueue, epoll, eventport, devpoll, and pollset. 2412Sigor@sysoev.ru */ 2512Sigor@sysoev.ru NXT_EVENT_BLOCKED, 2612Sigor@sysoev.ru 2712Sigor@sysoev.ru /* 2812Sigor@sysoev.ru * An active oneshot event. 2912Sigor@sysoev.ru * Used by epoll, devpoll, pollset, poll, and select. 3012Sigor@sysoev.ru */ 3112Sigor@sysoev.ru NXT_EVENT_ONESHOT, 3212Sigor@sysoev.ru 3312Sigor@sysoev.ru /* An active level-triggered event. Used by eventport. */ 3412Sigor@sysoev.ru NXT_EVENT_LEVEL, 3512Sigor@sysoev.ru 3612Sigor@sysoev.ru /* 3712Sigor@sysoev.ru * An active default event. The event type depends on interface: 3812Sigor@sysoev.ru * edge-triggered for kqueue, and modern epoll; 3912Sigor@sysoev.ru * level-triggered for old epoll, devpoll, pollset, poll, and select; 4012Sigor@sysoev.ru * oneshot for kqueue and eventport. 4112Sigor@sysoev.ru */ 4212Sigor@sysoev.ru NXT_EVENT_DEFAULT, 4312Sigor@sysoev.ru NXT_EVENT_ACTIVE = NXT_EVENT_DEFAULT, 4412Sigor@sysoev.ru } nxt_fd_event_state_t; 4512Sigor@sysoev.ru 4612Sigor@sysoev.ru 47*2084Salx.manpages@gmail.com #define nxt_fd_event_is_disabled(state) \ 4812Sigor@sysoev.ru ((state) < NXT_EVENT_ONESHOT) 4912Sigor@sysoev.ru 5012Sigor@sysoev.ru 51*2084Salx.manpages@gmail.com #define nxt_fd_event_is_active(state) \ 5212Sigor@sysoev.ru ((state) >= NXT_EVENT_ONESHOT) 5312Sigor@sysoev.ru 5412Sigor@sysoev.ru 5512Sigor@sysoev.ru struct nxt_fd_event_s { 5612Sigor@sysoev.ru void *data; 5712Sigor@sysoev.ru 5812Sigor@sysoev.ru /* Both are int's. */ 5912Sigor@sysoev.ru nxt_socket_t fd; 6012Sigor@sysoev.ru nxt_err_t error; 6112Sigor@sysoev.ru 6212Sigor@sysoev.ru /* The flags should also be prefetched by nxt_work_queue_pop(). */ 6312Sigor@sysoev.ru 6412Sigor@sysoev.ru #if (NXT_64BIT) 6512Sigor@sysoev.ru nxt_fd_event_state_t read:8; /* 3 bits. */ 6612Sigor@sysoev.ru nxt_fd_event_state_t write:8; /* 3 bits. */ 6712Sigor@sysoev.ru uint8_t read_ready; 6812Sigor@sysoev.ru uint8_t write_ready; 6912Sigor@sysoev.ru uint8_t changing; 7012Sigor@sysoev.ru uint8_t closed; 7112Sigor@sysoev.ru uint8_t timedout; 7213Sigor@sysoev.ru uint8_t shutdown:1; 7312Sigor@sysoev.ru #if (NXT_HAVE_EPOLL) 7412Sigor@sysoev.ru uint8_t epoll_eof:1; 7512Sigor@sysoev.ru uint8_t epoll_error:1; 7612Sigor@sysoev.ru #endif 7712Sigor@sysoev.ru #if (NXT_HAVE_KQUEUE) 7813Sigor@sysoev.ru uint8_t kq_eof:1; 7912Sigor@sysoev.ru #endif 8012Sigor@sysoev.ru 8112Sigor@sysoev.ru #else /* NXT_32BIT */ 8212Sigor@sysoev.ru nxt_fd_event_state_t read:3; 8312Sigor@sysoev.ru nxt_fd_event_state_t write:3; 8412Sigor@sysoev.ru uint8_t read_ready:1; 8512Sigor@sysoev.ru uint8_t write_ready:1; 8612Sigor@sysoev.ru uint8_t changing:1; 8712Sigor@sysoev.ru uint8_t closed:1; 8813Sigor@sysoev.ru uint8_t timedout:1; 8912Sigor@sysoev.ru uint8_t shutdown:1; 9012Sigor@sysoev.ru #if (NXT_HAVE_EPOLL) 9112Sigor@sysoev.ru uint8_t epoll_eof:1; 9212Sigor@sysoev.ru uint8_t epoll_error:1; 9312Sigor@sysoev.ru #endif 9412Sigor@sysoev.ru #if (NXT_HAVE_KQUEUE) 9512Sigor@sysoev.ru uint8_t kq_eof:1; 9612Sigor@sysoev.ru #endif 9712Sigor@sysoev.ru #endif /* NXT_64BIT */ 9812Sigor@sysoev.ru 9912Sigor@sysoev.ru #if (NXT_HAVE_KQUEUE) 10012Sigor@sysoev.ru /* nxt_err_t is int. */ 10112Sigor@sysoev.ru nxt_err_t kq_errno; 10212Sigor@sysoev.ru /* struct kevent.data is intptr_t, however int32_t is enough. */ 10312Sigor@sysoev.ru int32_t kq_available; 10412Sigor@sysoev.ru #endif 10512Sigor@sysoev.ru 10612Sigor@sysoev.ru nxt_task_t *task; 10712Sigor@sysoev.ru 10812Sigor@sysoev.ru nxt_work_queue_t *read_work_queue; 10912Sigor@sysoev.ru nxt_work_handler_t read_handler; 11012Sigor@sysoev.ru nxt_work_queue_t *write_work_queue; 11112Sigor@sysoev.ru nxt_work_handler_t write_handler; 11212Sigor@sysoev.ru nxt_work_handler_t error_handler; 11312Sigor@sysoev.ru 11412Sigor@sysoev.ru nxt_log_t *log; 11512Sigor@sysoev.ru }; 11612Sigor@sysoev.ru 11712Sigor@sysoev.ru 11812Sigor@sysoev.ru #endif /* _NXT_FD_EVENT_H_INCLUDED_ */ 119