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 \ 48 nxt_fd_event_is_disabled(state) \ 49 ((state) < NXT_EVENT_ONESHOT) 50 51 52 #define \ 53 nxt_fd_event_is_active(state) \ 54 ((state) >= NXT_EVENT_ONESHOT) 55 56 57 struct nxt_fd_event_s { 58 void *data; 59 60 /* Both are int's. */ 61 nxt_socket_t fd; 62 nxt_err_t error; 63 64 /* The flags should also be prefetched by nxt_work_queue_pop(). */ 65 66 #if (NXT_64BIT) 67 nxt_fd_event_state_t read:8; /* 3 bits. */ 68 nxt_fd_event_state_t write:8; /* 3 bits. */ 69 nxt_socket_error_level_t log_error:8; /* 3 bits. */ 70 uint8_t read_ready; 71 uint8_t write_ready; 72 uint8_t changing; 73 uint8_t closed; 74 uint8_t shutdown; 75 uint8_t timedout; 76 #if (NXT_HAVE_EPOLL) 77 uint8_t epoll_eof:1; 78 uint8_t epoll_error:1; 79 #endif 80 #if (NXT_HAVE_KQUEUE) 81 uint8_t kq_eof; 82 #endif 83 84 #else /* NXT_32BIT */ 85 nxt_fd_event_state_t read:3; 86 nxt_fd_event_state_t write:3; 87 nxt_socket_error_level_t log_error:3; 88 uint8_t read_ready:1; 89 uint8_t write_ready:1; 90 uint8_t changing:1; 91 uint8_t closed:1; 92 uint8_t shutdown:1; 93 uint8_t timedout:1; 94 #if (NXT_HAVE_EPOLL) 95 uint8_t epoll_eof:1; 96 uint8_t epoll_error:1; 97 #endif 98 #if (NXT_HAVE_KQUEUE) 99 uint8_t kq_eof:1; 100 #endif 101 #endif /* NXT_64BIT */ 102 103 #if (NXT_HAVE_KQUEUE) 104 /* nxt_err_t is int. */ 105 nxt_err_t kq_errno; 106 /* struct kevent.data is intptr_t, however int32_t is enough. */ 107 int32_t kq_available; 108 #endif 109 110 nxt_task_t *task; 111 112 nxt_work_queue_t *read_work_queue; 113 nxt_work_handler_t read_handler; 114 nxt_work_queue_t *write_work_queue; 115 nxt_work_handler_t write_handler; 116 nxt_work_handler_t error_handler; 117 118 nxt_log_t *log; 119 }; 120 121 122 #endif /* _NXT_FD_EVENT_H_INCLUDED_ */ 123