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 4712Sigor@sysoev.ru #define \ 4812Sigor@sysoev.ru nxt_fd_event_is_disabled(state) \ 4912Sigor@sysoev.ru ((state) < NXT_EVENT_ONESHOT) 5012Sigor@sysoev.ru 5112Sigor@sysoev.ru 5212Sigor@sysoev.ru #define \ 5312Sigor@sysoev.ru nxt_fd_event_is_active(state) \ 5412Sigor@sysoev.ru ((state) >= NXT_EVENT_ONESHOT) 5512Sigor@sysoev.ru 5612Sigor@sysoev.ru 5712Sigor@sysoev.ru struct nxt_fd_event_s { 5812Sigor@sysoev.ru void *data; 5912Sigor@sysoev.ru 6012Sigor@sysoev.ru /* Both are int's. */ 6112Sigor@sysoev.ru nxt_socket_t fd; 6212Sigor@sysoev.ru nxt_err_t error; 6312Sigor@sysoev.ru 6412Sigor@sysoev.ru /* The flags should also be prefetched by nxt_work_queue_pop(). */ 6512Sigor@sysoev.ru 6612Sigor@sysoev.ru #if (NXT_64BIT) 6712Sigor@sysoev.ru nxt_fd_event_state_t read:8; /* 3 bits. */ 6812Sigor@sysoev.ru nxt_fd_event_state_t write:8; /* 3 bits. */ 6912Sigor@sysoev.ru uint8_t read_ready; 7012Sigor@sysoev.ru uint8_t write_ready; 7112Sigor@sysoev.ru uint8_t changing; 7212Sigor@sysoev.ru uint8_t closed; 7312Sigor@sysoev.ru uint8_t timedout; 74*13Sigor@sysoev.ru uint8_t shutdown:1; 7512Sigor@sysoev.ru #if (NXT_HAVE_EPOLL) 7612Sigor@sysoev.ru uint8_t epoll_eof:1; 7712Sigor@sysoev.ru uint8_t epoll_error:1; 7812Sigor@sysoev.ru #endif 7912Sigor@sysoev.ru #if (NXT_HAVE_KQUEUE) 80*13Sigor@sysoev.ru uint8_t kq_eof:1; 8112Sigor@sysoev.ru #endif 8212Sigor@sysoev.ru 8312Sigor@sysoev.ru #else /* NXT_32BIT */ 8412Sigor@sysoev.ru nxt_fd_event_state_t read:3; 8512Sigor@sysoev.ru nxt_fd_event_state_t write:3; 8612Sigor@sysoev.ru uint8_t read_ready:1; 8712Sigor@sysoev.ru uint8_t write_ready:1; 8812Sigor@sysoev.ru uint8_t changing:1; 8912Sigor@sysoev.ru uint8_t closed:1; 90*13Sigor@sysoev.ru uint8_t timedout:1; 9112Sigor@sysoev.ru uint8_t shutdown:1; 9212Sigor@sysoev.ru #if (NXT_HAVE_EPOLL) 9312Sigor@sysoev.ru uint8_t epoll_eof:1; 9412Sigor@sysoev.ru uint8_t epoll_error:1; 9512Sigor@sysoev.ru #endif 9612Sigor@sysoev.ru #if (NXT_HAVE_KQUEUE) 9712Sigor@sysoev.ru uint8_t kq_eof:1; 9812Sigor@sysoev.ru #endif 9912Sigor@sysoev.ru #endif /* NXT_64BIT */ 10012Sigor@sysoev.ru 10112Sigor@sysoev.ru #if (NXT_HAVE_KQUEUE) 10212Sigor@sysoev.ru /* nxt_err_t is int. */ 10312Sigor@sysoev.ru nxt_err_t kq_errno; 10412Sigor@sysoev.ru /* struct kevent.data is intptr_t, however int32_t is enough. */ 10512Sigor@sysoev.ru int32_t kq_available; 10612Sigor@sysoev.ru #endif 10712Sigor@sysoev.ru 10812Sigor@sysoev.ru nxt_task_t *task; 10912Sigor@sysoev.ru 11012Sigor@sysoev.ru nxt_work_queue_t *read_work_queue; 11112Sigor@sysoev.ru nxt_work_handler_t read_handler; 11212Sigor@sysoev.ru nxt_work_queue_t *write_work_queue; 11312Sigor@sysoev.ru nxt_work_handler_t write_handler; 11412Sigor@sysoev.ru nxt_work_handler_t error_handler; 11512Sigor@sysoev.ru 11612Sigor@sysoev.ru nxt_log_t *log; 11712Sigor@sysoev.ru }; 11812Sigor@sysoev.ru 11912Sigor@sysoev.ru 12012Sigor@sysoev.ru #endif /* _NXT_FD_EVENT_H_INCLUDED_ */ 121