1 2 /* 3 * Copyright (C) Igor Sysoev 4 * Copyright (C) NGINX, Inc. 5 */ 6 7 #ifndef _NXT_FD_EVENT_H_INCLUDED_ 8 #define _NXT_FD_EVENT_H_INCLUDED_ 9 10 11 typedef enum { 12 /* A completely inactive event. */ 13 NXT_EVENT_INACTIVE = 0, 14 15 /* 16 * An event presents in the kernel but disabled after oneshot. 17 * Used by epoll. 18 */ 19 NXT_EVENT_DISABLED, 20 21 /* 22 * An event is active in the kernel but blocked by application. 23 * Used by kqueue, epoll, eventport, devpoll, and pollset. 24 */ 25 NXT_EVENT_BLOCKED, 26 27 /* 28 * An active oneshot event. 29 * Used by epoll, devpoll, pollset, poll, and select. 30 */ 31 NXT_EVENT_ONESHOT, 32 33 /* An active level-triggered event. Used by eventport. */ 34 NXT_EVENT_LEVEL, 35 36 /* 37 * An active default event. The event type depends on interface: 38 * edge-triggered for kqueue, and modern epoll; 39 * level-triggered for old epoll, devpoll, pollset, poll, and select; 40 * oneshot for kqueue and eventport. 41 */ 42 NXT_EVENT_DEFAULT, 43 NXT_EVENT_ACTIVE = NXT_EVENT_DEFAULT, 44 } nxt_fd_event_state_t; 45 46 47 #define nxt_fd_event_is_disabled(state) \ 48 ((state) < NXT_EVENT_ONESHOT) 49 50 51 #define nxt_fd_event_is_active(state) \ 52 ((state) >= NXT_EVENT_ONESHOT) 53 54 55 struct nxt_fd_event_s { 56 void *data; 57 58 /* Both are int's. */ 59 nxt_socket_t fd; 60 nxt_err_t error; 61 62 /* The flags should also be prefetched by nxt_work_queue_pop(). */ 63 64 #if (NXT_64BIT) 65 nxt_fd_event_state_t read:8; /* 3 bits. */ 66 nxt_fd_event_state_t write:8; /* 3 bits. */ 67 uint8_t read_ready; 68 uint8_t write_ready; 69 uint8_t changing; 70 uint8_t closed; 71 uint8_t timedout; 72 uint8_t shutdown:1; 73 #if (NXT_HAVE_EPOLL) 74 uint8_t epoll_eof:1; 75 uint8_t epoll_error:1; 76 #endif 77 #if (NXT_HAVE_KQUEUE) 78 uint8_t kq_eof:1; 79 #endif 80 81 #else /* NXT_32BIT */ 82 nxt_fd_event_state_t read:3; 83 nxt_fd_event_state_t write:3; 84 uint8_t read_ready:1; 85 uint8_t write_ready:1; 86 uint8_t changing:1; 87 uint8_t closed:1; 88 uint8_t timedout:1; 89 uint8_t shutdown:1; 90 #if (NXT_HAVE_EPOLL) 91 uint8_t epoll_eof:1; 92 uint8_t epoll_error:1; 93 #endif 94 #if (NXT_HAVE_KQUEUE) 95 uint8_t kq_eof:1; 96 #endif 97 #endif /* NXT_64BIT */ 98 99 #if (NXT_HAVE_KQUEUE) 100 /* nxt_err_t is int. */ 101 nxt_err_t kq_errno; 102 /* struct kevent.data is intptr_t, however int32_t is enough. */ 103 int32_t kq_available; 104 #endif 105 106 nxt_task_t *task; 107 108 nxt_work_queue_t *read_work_queue; 109 nxt_work_handler_t read_handler; 110 nxt_work_queue_t *write_work_queue; 111 nxt_work_handler_t write_handler; 112 nxt_work_handler_t error_handler; 113 114 nxt_log_t *log; 115 }; 116 117 118 #endif /* _NXT_FD_EVENT_H_INCLUDED_ */ 119