src/event/ngx_event.h - nginx-1.31.9 nginx/ @ 2a3a19c6f

Data types defined

Macros defined

Source code


  1. /*
  2. * Copyright (C) Igor Sysoev
  3. * Copyright (C) Nginx, Inc.
  4. */


  5. #ifndef _NGX_EVENT_H_INCLUDED_
  6. ‌#define _NGX_EVENT_H_INCLUDED_


  7. #include <ngx_config.h>
  8. #include <ngx_core.h>


  9. ‌#define NGX_INVALID_INDEX  0xd0d0d0d0


  10. ‌struct ngx_event_s {
  11.     void            *data;

  12.     unsigned         write:1;

  13.     unsigned         accept:1;

  14.     /* used to detect the stale events in kqueue and epoll */
  15.     unsigned         instance:1;

  16.     /*
  17.      * the event was passed or would be passed to a kernel;
  18.      * in aio mode - operation was posted.
  19.      */
  20.     unsigned         active:1;

  21.     unsigned         disabled:1;

  22.     /* the ready event; in aio mode 0 means that no operation can be posted */
  23.     unsigned         ready:1;

  24.     unsigned         oneshot:1;

  25.     /* aio operation is complete */
  26.     unsigned         complete:1;

  27.     unsigned         eof:1;
  28.     unsigned         error:1;

  29.     unsigned         timedout:1;
  30.     unsigned         timer_set:1;

  31.     unsigned         delayed:1;

  32.     unsigned         deferred_accept:1;

  33.     /* the pending eof reported by kqueue, epoll or in aio chain operation */
  34.     unsigned         pending_eof:1;

  35.     unsigned         posted:1;

  36.     unsigned         closed:1;

  37.     /* to test on worker exit */
  38.     unsigned         channel:1;
  39.     unsigned         resolver:1;
  40.     unsigned         quic:1;

  41.     unsigned         cancelable:1;

  42. #if (NGX_HAVE_KQUEUE)
  43.     unsigned         kq_vnode:1;

  44.     /* the pending errno reported by kqueue */
  45.     int              kq_errno;
  46. #endif

  47.     /*
  48.      * kqueue only:
  49.      *   accept:     number of sockets that wait to be accepted
  50.      *   read:       bytes to read when event is ready
  51.      *               or lowat when event is set with NGX_LOWAT_EVENT flag
  52.      *   write:      available space in buffer when event is ready
  53.      *               or lowat when event is set with NGX_LOWAT_EVENT flag
  54.      *
  55.      * otherwise:
  56.      *   accept:     1 if accept many, 0 otherwise
  57.      *   read:       bytes to read when event is ready, -1 if not known
  58.      */

  59.     int              available;

  60.     ngx_event_handler_pt  handler;

  61.     ngx_uint_t       index;

  62.     ngx_log_t       *log;

  63.     ngx_rbtree_node_t   timer;

  64.     /* the posted queue */
  65.     ngx_queue_t      queue;

  66. #if 0

  67.     /* the threads support */

  68.     /*
  69.      * the event thread context, we store it here
  70.      * if $(CC) does not understand __thread declaration
  71.      * and pthread_getspecific() is too costly
  72.      */

  73.     void            *thr_ctx;

  74. #if (NGX_EVENT_T_PADDING)

  75.     /* event should not cross cache line in SMP */

  76.     uint32_t         padding[NGX_EVENT_T_PADDING];
  77. #endif
  78. #endif
  79. };


  80. #if (NGX_HAVE_FILE_AIO)

  81. ‌struct ngx_event_aio_s {
  82.     void                      *data;
  83.     ngx_event_handler_pt       handler;
  84.     ngx_file_t                *file;

  85.     ngx_fd_t                   fd;

  86. #if (NGX_HAVE_EVENTFD)
  87.     int64_t                    res;
  88. #endif

  89. #if !(NGX_HAVE_EVENTFD) || (NGX_TEST_BUILD_EPOLL)
  90.     ngx_err_t                  err;
  91.     size_t                     nbytes;
  92. #endif

  93.     ngx_aiocb_t                aiocb;
  94.     ngx_event_t                event;
  95. };

  96. #endif


  97. ‌typedef struct {
  98.     ngx_int_t  (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
  99.     ngx_int_t  (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);

  100.     ngx_int_t  (*enable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
  101.     ngx_int_t  (*disable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);

  102.     ngx_int_t  (*add_conn)(ngx_connection_t *c);
  103.     ngx_int_t  (*del_conn)(ngx_connection_t *c, ngx_uint_t flags);

  104.     ngx_int_t  (*notify)(ngx_event_handler_pt handler);

  105.     ngx_int_t  (*process_events)(ngx_cycle_t *cycle, ngx_msec_t timer,
  106.                                  ngx_uint_t flags);

  107.     ngx_int_t  (*init)(ngx_cycle_t *cycle, ngx_msec_t timer);
  108.     void       (*done)(ngx_cycle_t *cycle);
  109. ‌} ngx_event_actions_t;


  110. extern ngx_event_actions_t   ngx_event_actions;
  111. #if (NGX_HAVE_EPOLLRDHUP)
  112. extern ngx_uint_t            ngx_use_epoll_rdhup;
  113. #endif


  114. /*
  115. * The event filter requires to read/write the whole data:
  116. * select, poll, /dev/poll, kqueue, epoll.
  117. */
  118. ‌#define NGX_USE_LEVEL_EVENT      0x00000001

  119. /*
  120. * The event filter is deleted after a notification without an additional
  121. * syscall: kqueue, epoll.
  122. */
  123. ‌#define NGX_USE_ONESHOT_EVENT    0x00000002

  124. /*
  125. * The event filter notifies only the changes and an initial level:
  126. * kqueue, epoll.
  127. */
  128. ‌#define NGX_USE_CLEAR_EVENT      0x00000004

  129. /*
  130. * The event filter has kqueue features: the eof flag, errno,
  131. * available data, etc.
  132. */
  133. ‌#define NGX_USE_KQUEUE_EVENT     0x00000008

  134. /*
  135. * The event filter supports low water mark: kqueue's NOTE_LOWAT.
  136. * kqueue in FreeBSD 4.1-4.2 has no NOTE_LOWAT so we need a separate flag.
  137. */
  138. ‌#define NGX_USE_LOWAT_EVENT      0x00000010

  139. /*
  140. * The event filter requires to do i/o operation until EAGAIN: epoll.
  141. */
  142. ‌#define NGX_USE_GREEDY_EVENT     0x00000020

  143. /*
  144. * The event filter is epoll.
  145. */
  146. ‌#define NGX_USE_EPOLL_EVENT      0x00000040

  147. /*
  148. * Obsolete.
  149. */
  150. ‌#define NGX_USE_RTSIG_EVENT      0x00000080

  151. /*
  152. * Obsolete.
  153. */
  154. ‌#define NGX_USE_AIO_EVENT        0x00000100

  155. /*
  156. * The event filter has no opaque data and requires file descriptors table:
  157. * poll, /dev/poll.
  158. */
  159. ‌#define NGX_USE_FD_EVENT         0x00000400

  160. /*
  161. * The event module handles periodic or absolute timer event by itself:
  162. * kqueue in FreeBSD 4.4, NetBSD 2.0, and MacOSX 10.4, Solaris 10's event ports.
  163. */
  164. ‌#define NGX_USE_TIMER_EVENT      0x00000800

  165. /*
  166. * All event filters on file descriptor are deleted after a notification:
  167. * Solaris 10's event ports.
  168. */
  169. ‌#define NGX_USE_EVENTPORT_EVENT  0x00001000

  170. /*
  171. * The event filter support vnode notifications: kqueue.
  172. */
  173. ‌#define NGX_USE_VNODE_EVENT      0x00002000


  174. /*
  175. * The event filter is deleted just before the closing file.
  176. * Has no meaning for select and poll.
  177. * kqueue, epoll, eventport:         allows to avoid explicit delete,
  178. *                                   because filter automatically is deleted
  179. *                                   on file close,
  180. *
  181. * /dev/poll:                        we need to flush POLLREMOVE event
  182. *                                   before closing file.
  183. */
  184. ‌#define NGX_CLOSE_EVENT    1

  185. /*
  186. * disable temporarily event filter, this may avoid locks
  187. * in kernel malloc()/free(): kqueue.
  188. */
  189. ‌#define NGX_DISABLE_EVENT  2

  190. /*
  191. * event must be passed to kernel right now, do not wait until batch processing.
  192. */
  193. ‌#define NGX_FLUSH_EVENT    4


  194. /* these flags have a meaning only for kqueue */
  195. ‌#define NGX_LOWAT_EVENT    0
  196. ‌#define NGX_VNODE_EVENT    0


  197. #if (NGX_HAVE_EPOLL) && !(NGX_HAVE_EPOLLRDHUP)
  198. ‌#define EPOLLRDHUP         0
  199. #endif


  200. #if (NGX_HAVE_KQUEUE)

  201. ‌#define NGX_READ_EVENT     EVFILT_READ
  202. ‌#define NGX_WRITE_EVENT    EVFILT_WRITE

  203. #undef  NGX_VNODE_EVENT
  204. ‌#define NGX_VNODE_EVENT    EVFILT_VNODE

  205. /*
  206. * NGX_CLOSE_EVENT, NGX_LOWAT_EVENT, and NGX_FLUSH_EVENT are the module flags
  207. * and they must not go into a kernel so we need to choose the value
  208. * that must not interfere with any existent and future kqueue flags.
  209. * kqueue has such values - EV_FLAG1, EV_EOF, and EV_ERROR:
  210. * they are reserved and cleared on a kernel entrance.
  211. */
  212. #undef  NGX_CLOSE_EVENT
  213. ‌#define NGX_CLOSE_EVENT    EV_EOF

  214. #undef  NGX_LOWAT_EVENT
  215. ‌#define NGX_LOWAT_EVENT    EV_FLAG1

  216. #undef  NGX_FLUSH_EVENT
  217. ‌#define NGX_FLUSH_EVENT    EV_ERROR

  218. ‌#define NGX_LEVEL_EVENT    0
  219. ‌#define NGX_ONESHOT_EVENT  EV_ONESHOT
  220. ‌#define NGX_CLEAR_EVENT    EV_CLEAR

  221. #undef  NGX_DISABLE_EVENT
  222. ‌#define NGX_DISABLE_EVENT  EV_DISABLE


  223. #elif (NGX_HAVE_DEVPOLL && !(NGX_TEST_BUILD_DEVPOLL)) \
  224.       || (NGX_HAVE_EVENTPORT && !(NGX_TEST_BUILD_EVENTPORT))

  225. ‌#define NGX_READ_EVENT     POLLIN
  226. ‌#define NGX_WRITE_EVENT    POLLOUT

  227. ‌#define NGX_LEVEL_EVENT    0
  228. ‌#define NGX_ONESHOT_EVENT  1


  229. #elif (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL)

  230. ‌#define NGX_READ_EVENT     (EPOLLIN|EPOLLRDHUP)
  231. ‌#define NGX_WRITE_EVENT    EPOLLOUT

  232. ‌#define NGX_LEVEL_EVENT    0
  233. ‌#define NGX_CLEAR_EVENT    EPOLLET
  234. ‌#define NGX_ONESHOT_EVENT  0x70000000
  235. #if 0
  236. #define NGX_ONESHOT_EVENT  EPOLLONESHOT
  237. #endif

  238. #if (NGX_HAVE_EPOLLEXCLUSIVE)
  239. ‌#define NGX_EXCLUSIVE_EVENT  EPOLLEXCLUSIVE
  240. #endif

  241. #elif (NGX_HAVE_POLL)

  242. ‌#define NGX_READ_EVENT     POLLIN
  243. ‌#define NGX_WRITE_EVENT    POLLOUT

  244. ‌#define NGX_LEVEL_EVENT    0
  245. ‌#define NGX_ONESHOT_EVENT  1


  246. #else /* select */

  247. ‌#define NGX_READ_EVENT     0
  248. ‌#define NGX_WRITE_EVENT    1

  249. ‌#define NGX_LEVEL_EVENT    0
  250. ‌#define NGX_ONESHOT_EVENT  1

  251. #endif /* NGX_HAVE_KQUEUE */


  252. #if (NGX_TEST_BUILD_EPOLL)
  253. ‌#define NGX_EXCLUSIVE_EVENT  0
  254. #endif


  255. #ifndef NGX_CLEAR_EVENT
  256. ‌#define NGX_CLEAR_EVENT    0    /* dummy declaration */
  257. #endif


  258. ‌#define ngx_process_events   ngx_event_actions.process_events
  259. ‌#define ngx_done_events      ngx_event_actions.done

  260. ‌#define ngx_add_event        ngx_event_actions.add
  261. ‌#define ngx_del_event        ngx_event_actions.del
  262. ‌#define ngx_add_conn         ngx_event_actions.add_conn
  263. ‌#define ngx_del_conn         ngx_event_actions.del_conn

  264. ‌#define ngx_notify           ngx_event_actions.notify

  265. ‌#define ngx_add_timer        ngx_event_add_timer
  266. ‌#define ngx_del_timer        ngx_event_del_timer


  267. extern ngx_os_io_t  ngx_io;

  268. ‌#define ngx_recv             ngx_io.recv
  269. ‌#define ngx_recv_chain       ngx_io.recv_chain
  270. ‌#define ngx_udp_recv         ngx_io.udp_recv
  271. ‌#define ngx_send             ngx_io.send
  272. ‌#define ngx_send_chain       ngx_io.send_chain
  273. ‌#define ngx_udp_send         ngx_io.udp_send
  274. ‌#define ngx_udp_send_chain   ngx_io.udp_send_chain


  275. ‌#define NGX_EVENT_MODULE      0x544E5645  /* "EVNT" */
  276. ‌#define NGX_EVENT_CONF        0x02000000


  277. ‌typedef struct {
  278.     ngx_uint_t    connections;
  279.     ngx_uint_t    use;

  280.     ngx_flag_t    multi_accept;
  281.     ngx_flag_t    accept_mutex;

  282.     ngx_msec_t    accept_mutex_delay;

  283.     u_char       *name;

  284. #if (NGX_DEBUG)
  285.     ngx_array_t   debug_connection;
  286. #endif
  287. ‌} ngx_event_conf_t;


  288. ‌typedef struct {
  289.     ngx_str_t              *name;

  290.     void                 *(*create_conf)(ngx_cycle_t *cycle);
  291.     char                 *(*init_conf)(ngx_cycle_t *cycle, void *conf);

  292.     ngx_event_actions_t     actions;
  293. ‌} ngx_event_module_t;


  294. extern ngx_atomic_t          *ngx_connection_counter;

  295. extern ngx_atomic_t          *ngx_accept_mutex_ptr;
  296. extern ngx_shmtx_t            ngx_accept_mutex;
  297. extern ngx_uint_t             ngx_use_accept_mutex;
  298. extern ngx_uint_t             ngx_accept_events;
  299. extern ngx_uint_t             ngx_accept_mutex_held;
  300. extern ngx_msec_t             ngx_accept_mutex_delay;
  301. extern ngx_int_t              ngx_accept_disabled;
  302. extern ngx_uint_t             ngx_use_exclusive_accept;


  303. #if (NGX_STAT_STUB)

  304. extern ngx_atomic_t  *ngx_stat_accepted;
  305. extern ngx_atomic_t  *ngx_stat_handled;
  306. extern ngx_atomic_t  *ngx_stat_requests;
  307. extern ngx_atomic_t  *ngx_stat_active;
  308. extern ngx_atomic_t  *ngx_stat_reading;
  309. extern ngx_atomic_t  *ngx_stat_writing;
  310. extern ngx_atomic_t  *ngx_stat_waiting;

  311. #endif


  312. ‌#define NGX_UPDATE_TIME         1
  313. ‌#define NGX_POST_EVENTS         2


  314. extern sig_atomic_t           ngx_event_timer_alarm;
  315. extern ngx_uint_t             ngx_event_flags;
  316. extern ngx_module_t           ngx_events_module;
  317. extern ngx_module_t           ngx_event_core_module;


  318. ‌#define ngx_event_get_conf(conf_ctx, module)                                  \
  319.              (*(ngx_get_conf(conf_ctx, ngx_events_module))) [module.ctx_index]



  320. void ngx_event_accept(ngx_event_t *ev);
  321. ngx_int_t ngx_trylock_accept_mutex(ngx_cycle_t *cycle);
  322. ngx_int_t ngx_enable_accept_events(ngx_cycle_t *cycle);
  323. u_char *ngx_accept_log_error(ngx_log_t *log, u_char *buf, size_t len);
  324. #if (NGX_DEBUG)
  325. void ngx_debug_accepted_connection(ngx_event_conf_t *ecf, ngx_connection_t *c);
  326. #endif


  327. void ngx_process_events_and_timers(ngx_cycle_t *cycle);
  328. ngx_int_t ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags);
  329. ngx_int_t ngx_handle_write_event(ngx_event_t *wev, size_t lowat);


  330. ngx_int_t ngx_send_lowat(ngx_connection_t *c, size_t lowat);


  331. /* used in ngx_log_debugX() */
  332. ‌#define ngx_event_ident(p)  ((ngx_connection_t *) (p))->fd


  333. #include <ngx_event_timer.h>
  334. #include <ngx_event_posted.h>
  335. #include <ngx_event_udp.h>


  336. #endif /* _NGX_EVENT_H_INCLUDED_ */