10Sigor@sysoev.ru
20Sigor@sysoev.ru /*
30Sigor@sysoev.ru * Copyright (C) Igor Sysoev
40Sigor@sysoev.ru * Copyright (C) NGINX, Inc.
50Sigor@sysoev.ru */
60Sigor@sysoev.ru
70Sigor@sysoev.ru #ifndef _NXT_EVENT_ENGINE_H_INCLUDED_
80Sigor@sysoev.ru #define _NXT_EVENT_ENGINE_H_INCLUDED_
90Sigor@sysoev.ru
1012Sigor@sysoev.ru /*
1112Sigor@sysoev.ru * An event interface is kernel interface such as kqueue, epoll, etc.
1212Sigor@sysoev.ru * intended to get event notifications about file descriptor state,
1312Sigor@sysoev.ru * signals, etc.
1412Sigor@sysoev.ru */
1512Sigor@sysoev.ru
1612Sigor@sysoev.ru #define NXT_FILE_EVENTS 1
1712Sigor@sysoev.ru #define NXT_NO_FILE_EVENTS 0
1812Sigor@sysoev.ru
1912Sigor@sysoev.ru #define NXT_SIGNAL_EVENTS 1
2012Sigor@sysoev.ru #define NXT_NO_SIGNAL_EVENTS 0
2112Sigor@sysoev.ru
2212Sigor@sysoev.ru
2312Sigor@sysoev.ru typedef struct {
2412Sigor@sysoev.ru
2512Sigor@sysoev.ru /* The canonical event set name. */
2612Sigor@sysoev.ru const char *name;
2712Sigor@sysoev.ru
2812Sigor@sysoev.ru /*
2912Sigor@sysoev.ru * Create an event set. The mchanges argument is a maximum number of
3012Sigor@sysoev.ru * changes to send to the kernel. The mevents argument is a maximum
3112Sigor@sysoev.ru * number of events to retrieve from the kernel at once, if underlying
3212Sigor@sysoev.ru * event facility supports batch operations.
3312Sigor@sysoev.ru */
3412Sigor@sysoev.ru nxt_int_t (*create)(nxt_event_engine_t *engine,
3512Sigor@sysoev.ru nxt_uint_t mchanges, nxt_uint_t mevents);
3612Sigor@sysoev.ru
3712Sigor@sysoev.ru /* Close and free an event set. */
3812Sigor@sysoev.ru void (*free)(nxt_event_engine_t *engine);
3912Sigor@sysoev.ru
4012Sigor@sysoev.ru /*
4112Sigor@sysoev.ru * Add a file descriptor to an event set and enable the most
4212Sigor@sysoev.ru * effective read and write event notification method provided
4312Sigor@sysoev.ru * by underlying event facility.
4412Sigor@sysoev.ru */
4512Sigor@sysoev.ru void (*enable)(nxt_event_engine_t *engine,
4612Sigor@sysoev.ru nxt_fd_event_t *ev);
4712Sigor@sysoev.ru
4812Sigor@sysoev.ru /* Disable file descriptor event notifications. */
4912Sigor@sysoev.ru void (*disable)(nxt_event_engine_t *engine,
5012Sigor@sysoev.ru nxt_fd_event_t *ev);
5112Sigor@sysoev.ru
5212Sigor@sysoev.ru /*
5312Sigor@sysoev.ru * Delete a file descriptor from an event set. A possible usage
5412Sigor@sysoev.ru * is a moving of the file descriptor from one event set to another.
5512Sigor@sysoev.ru */
5612Sigor@sysoev.ru void (*delete)(nxt_event_engine_t *engine,
5712Sigor@sysoev.ru nxt_fd_event_t *ev);
5812Sigor@sysoev.ru
5912Sigor@sysoev.ru /*
6012Sigor@sysoev.ru * Delete a file descriptor from an event set before closing the
6112Sigor@sysoev.ru * file descriptor. The most event facilities such as Linux epoll,
6212Sigor@sysoev.ru * BSD kqueue, Solaris event ports, AIX pollset, and HP-UX /dev/poll
6312Sigor@sysoev.ru * delete a file descriptor automatically on the file descriptor close.
6412Sigor@sysoev.ru * Some facilities such as Solaris /dev/poll require to delete a file
6512Sigor@sysoev.ru * descriptor explicitly.
6612Sigor@sysoev.ru */
6712Sigor@sysoev.ru nxt_bool_t (*close)(nxt_event_engine_t *engine,
6812Sigor@sysoev.ru nxt_fd_event_t *ev);
6912Sigor@sysoev.ru
7012Sigor@sysoev.ru /*
7112Sigor@sysoev.ru * Add a file descriptor to an event set and enable the most effective
7212Sigor@sysoev.ru * read event notification method provided by underlying event facility.
7312Sigor@sysoev.ru */
7412Sigor@sysoev.ru void (*enable_read)(nxt_event_engine_t *engine,
7512Sigor@sysoev.ru nxt_fd_event_t *ev);
7612Sigor@sysoev.ru
7712Sigor@sysoev.ru /*
7812Sigor@sysoev.ru * Add a file descriptor to an event set and enable the most effective
7912Sigor@sysoev.ru * write event notification method provided by underlying event facility.
8012Sigor@sysoev.ru */
8112Sigor@sysoev.ru void (*enable_write)(nxt_event_engine_t *engine,
8212Sigor@sysoev.ru nxt_fd_event_t *ev);
8312Sigor@sysoev.ru
8412Sigor@sysoev.ru /* Disable file descriptor read event notifications. */
8512Sigor@sysoev.ru void (*disable_read)(nxt_event_engine_t *engine,
8612Sigor@sysoev.ru nxt_fd_event_t *ev);
8712Sigor@sysoev.ru
8812Sigor@sysoev.ru /* Disable file descriptor write event notifications. */
8912Sigor@sysoev.ru void (*disable_write)(nxt_event_engine_t *engine,
9012Sigor@sysoev.ru nxt_fd_event_t *ev);
9112Sigor@sysoev.ru
9212Sigor@sysoev.ru /* Block file descriptor read event notifications. */
9312Sigor@sysoev.ru void (*block_read)(nxt_event_engine_t *engine,
9412Sigor@sysoev.ru nxt_fd_event_t *ev);
9512Sigor@sysoev.ru
9612Sigor@sysoev.ru /* Block file descriptor write event notifications. */
9712Sigor@sysoev.ru void (*block_write)(nxt_event_engine_t *engine,
9812Sigor@sysoev.ru nxt_fd_event_t *ev);
9912Sigor@sysoev.ru
10012Sigor@sysoev.ru /*
10112Sigor@sysoev.ru * Add a file descriptor to an event set and enable an oneshot
10212Sigor@sysoev.ru * read event notification method.
10312Sigor@sysoev.ru */
10412Sigor@sysoev.ru void (*oneshot_read)(nxt_event_engine_t *engine,
10512Sigor@sysoev.ru nxt_fd_event_t *ev);
10612Sigor@sysoev.ru
10712Sigor@sysoev.ru /*
10812Sigor@sysoev.ru * Add a file descriptor to an event set and enable an oneshot
10912Sigor@sysoev.ru * write event notification method.
11012Sigor@sysoev.ru */
11112Sigor@sysoev.ru void (*oneshot_write)(nxt_event_engine_t *engine,
11212Sigor@sysoev.ru nxt_fd_event_t *ev);
11312Sigor@sysoev.ru
11412Sigor@sysoev.ru /*
11512Sigor@sysoev.ru * Add a listening socket descriptor to an event set and enable
11612Sigor@sysoev.ru * a level-triggered read event notification method.
11712Sigor@sysoev.ru */
11812Sigor@sysoev.ru void (*enable_accept)(nxt_event_engine_t *engine,
11912Sigor@sysoev.ru nxt_fd_event_t *ev);
12012Sigor@sysoev.ru
12112Sigor@sysoev.ru /*
12212Sigor@sysoev.ru * Add a file to an event set and enable a file change notification
12312Sigor@sysoev.ru * events.
12412Sigor@sysoev.ru */
12512Sigor@sysoev.ru void (*enable_file)(nxt_event_engine_t *engine,
12662Sigor@sysoev.ru nxt_file_event_t *ev);
12712Sigor@sysoev.ru
12812Sigor@sysoev.ru /*
12912Sigor@sysoev.ru * Delete a file from an event set before closing the file descriptor.
13012Sigor@sysoev.ru */
13112Sigor@sysoev.ru void (*close_file)(nxt_event_engine_t *engine,
13262Sigor@sysoev.ru nxt_file_event_t *ev);
13312Sigor@sysoev.ru
13412Sigor@sysoev.ru /*
13512Sigor@sysoev.ru * Enable post event notifications and set a post handler to handle
13612Sigor@sysoev.ru * the zero signal.
13712Sigor@sysoev.ru */
13812Sigor@sysoev.ru nxt_int_t (*enable_post)(nxt_event_engine_t *engine,
13912Sigor@sysoev.ru nxt_work_handler_t handler);
14012Sigor@sysoev.ru
14112Sigor@sysoev.ru /*
14212Sigor@sysoev.ru * Signal an event set. If a signal number is non-zero then
14312Sigor@sysoev.ru * a signal handler added to the event set is called. This is
14412Sigor@sysoev.ru * a way to route Unix signals to an event engine if underlying
14512Sigor@sysoev.ru * event facility does not support signal events.
14612Sigor@sysoev.ru *
14712Sigor@sysoev.ru * If a signal number is zero, then the post_handler of the event
14812Sigor@sysoev.ru * set is called. This has no relation to Unix signals but is
14912Sigor@sysoev.ru * a way to wake up the event set to process works posted to
15012Sigor@sysoev.ru * the event engine locked work queue.
15112Sigor@sysoev.ru */
15212Sigor@sysoev.ru void (*signal)(nxt_event_engine_t *engine,
15312Sigor@sysoev.ru nxt_uint_t signo);
15412Sigor@sysoev.ru
15512Sigor@sysoev.ru /* Poll an event set for new event notifications. */
15612Sigor@sysoev.ru void (*poll)(nxt_event_engine_t *engine,
15712Sigor@sysoev.ru nxt_msec_t timeout);
15812Sigor@sysoev.ru
15912Sigor@sysoev.ru /* I/O operations suitable to underlying event facility. */
16062Sigor@sysoev.ru nxt_conn_io_t *io;
16112Sigor@sysoev.ru
16212Sigor@sysoev.ru /* True if an event facility supports file change event notifications. */
16312Sigor@sysoev.ru uint8_t file_support; /* 1 bit */
16412Sigor@sysoev.ru
16512Sigor@sysoev.ru /* True if an event facility supports signal event notifications. */
16612Sigor@sysoev.ru uint8_t signal_support; /* 1 bit */
16712Sigor@sysoev.ru } nxt_event_interface_t;
16812Sigor@sysoev.ru
16912Sigor@sysoev.ru
17012Sigor@sysoev.ru #if (NXT_HAVE_KQUEUE)
17112Sigor@sysoev.ru
17212Sigor@sysoev.ru typedef struct {
17312Sigor@sysoev.ru int fd;
17412Sigor@sysoev.ru int nchanges;
17512Sigor@sysoev.ru int mchanges;
17612Sigor@sysoev.ru int mevents;
17712Sigor@sysoev.ru nxt_pid_t pid;
17812Sigor@sysoev.ru
17912Sigor@sysoev.ru nxt_work_handler_t post_handler;
18012Sigor@sysoev.ru
18112Sigor@sysoev.ru struct kevent *changes;
18212Sigor@sysoev.ru struct kevent *events;
18312Sigor@sysoev.ru } nxt_kqueue_engine_t;
18412Sigor@sysoev.ru
18512Sigor@sysoev.ru extern const nxt_event_interface_t nxt_kqueue_engine;
18612Sigor@sysoev.ru
18712Sigor@sysoev.ru #endif
18812Sigor@sysoev.ru
18912Sigor@sysoev.ru
19012Sigor@sysoev.ru #if (NXT_HAVE_EPOLL)
19112Sigor@sysoev.ru
19212Sigor@sysoev.ru typedef struct {
19312Sigor@sysoev.ru int op;
19412Sigor@sysoev.ru struct epoll_event event;
19512Sigor@sysoev.ru } nxt_epoll_change_t;
19612Sigor@sysoev.ru
19712Sigor@sysoev.ru
19812Sigor@sysoev.ru typedef struct {
19912Sigor@sysoev.ru int fd;
20012Sigor@sysoev.ru uint32_t mode;
20112Sigor@sysoev.ru nxt_uint_t nchanges;
20212Sigor@sysoev.ru nxt_uint_t mchanges;
20312Sigor@sysoev.ru int mevents;
20412Sigor@sysoev.ru
205813Sigor@sysoev.ru uint8_t error; /* 1 bit */
206813Sigor@sysoev.ru
20712Sigor@sysoev.ru nxt_epoll_change_t *changes;
20812Sigor@sysoev.ru struct epoll_event *events;
20912Sigor@sysoev.ru
21012Sigor@sysoev.ru #if (NXT_HAVE_EVENTFD)
21112Sigor@sysoev.ru nxt_work_handler_t post_handler;
21212Sigor@sysoev.ru nxt_fd_event_t eventfd;
21312Sigor@sysoev.ru uint32_t neventfd;
21412Sigor@sysoev.ru #endif
21512Sigor@sysoev.ru
21612Sigor@sysoev.ru #if (NXT_HAVE_SIGNALFD)
21712Sigor@sysoev.ru nxt_fd_event_t signalfd;
21812Sigor@sysoev.ru #endif
21912Sigor@sysoev.ru } nxt_epoll_engine_t;
22012Sigor@sysoev.ru
22112Sigor@sysoev.ru
22212Sigor@sysoev.ru extern const nxt_event_interface_t nxt_epoll_edge_engine;
22312Sigor@sysoev.ru extern const nxt_event_interface_t nxt_epoll_level_engine;
22412Sigor@sysoev.ru
22512Sigor@sysoev.ru #endif
22612Sigor@sysoev.ru
22712Sigor@sysoev.ru
22812Sigor@sysoev.ru #if (NXT_HAVE_EVENTPORT)
22912Sigor@sysoev.ru
23012Sigor@sysoev.ru typedef struct {
23112Sigor@sysoev.ru int events;
23212Sigor@sysoev.ru nxt_fd_event_t *event;
23312Sigor@sysoev.ru } nxt_eventport_change_t;
23412Sigor@sysoev.ru
23512Sigor@sysoev.ru
23612Sigor@sysoev.ru typedef struct {
23712Sigor@sysoev.ru int fd;
23812Sigor@sysoev.ru nxt_uint_t nchanges;
23912Sigor@sysoev.ru nxt_uint_t mchanges;
24012Sigor@sysoev.ru u_int mevents;
24112Sigor@sysoev.ru
24212Sigor@sysoev.ru nxt_eventport_change_t *changes;
24312Sigor@sysoev.ru port_event_t *events;
24412Sigor@sysoev.ru
24512Sigor@sysoev.ru nxt_work_handler_t post_handler;
24612Sigor@sysoev.ru nxt_work_handler_t signal_handler;
24712Sigor@sysoev.ru } nxt_eventport_engine_t;
24812Sigor@sysoev.ru
24912Sigor@sysoev.ru extern const nxt_event_interface_t nxt_eventport_engine;
25012Sigor@sysoev.ru
25112Sigor@sysoev.ru #endif
25212Sigor@sysoev.ru
25312Sigor@sysoev.ru
25412Sigor@sysoev.ru #if (NXT_HAVE_DEVPOLL)
25512Sigor@sysoev.ru
25612Sigor@sysoev.ru typedef struct {
25712Sigor@sysoev.ru uint8_t op;
25812Sigor@sysoev.ru short events;
25912Sigor@sysoev.ru nxt_fd_event_t *event;
26012Sigor@sysoev.ru } nxt_devpoll_change_t;
26112Sigor@sysoev.ru
26212Sigor@sysoev.ru
26312Sigor@sysoev.ru typedef struct {
26412Sigor@sysoev.ru int fd;
26512Sigor@sysoev.ru int nchanges;
26612Sigor@sysoev.ru int mchanges;
26712Sigor@sysoev.ru int mevents;
26812Sigor@sysoev.ru
26912Sigor@sysoev.ru nxt_devpoll_change_t *changes;
27012Sigor@sysoev.ru struct pollfd *write_changes;
27112Sigor@sysoev.ru struct pollfd *events;
27212Sigor@sysoev.ru nxt_lvlhsh_t fd_hash;
27312Sigor@sysoev.ru } nxt_devpoll_engine_t;
27412Sigor@sysoev.ru
27512Sigor@sysoev.ru extern const nxt_event_interface_t nxt_devpoll_engine;
27612Sigor@sysoev.ru
27712Sigor@sysoev.ru #endif
27812Sigor@sysoev.ru
27912Sigor@sysoev.ru
28012Sigor@sysoev.ru #if (NXT_HAVE_POLLSET)
28112Sigor@sysoev.ru
28212Sigor@sysoev.ru typedef struct {
28312Sigor@sysoev.ru uint8_t op;
28412Sigor@sysoev.ru uint8_t cmd;
28512Sigor@sysoev.ru short events;
28612Sigor@sysoev.ru nxt_fd_event_t *event;
28712Sigor@sysoev.ru } nxt_pollset_change_t;
28812Sigor@sysoev.ru
28912Sigor@sysoev.ru
29012Sigor@sysoev.ru typedef struct {
29112Sigor@sysoev.ru pollset_t ps;
29212Sigor@sysoev.ru int nchanges;
29312Sigor@sysoev.ru int mchanges;
29412Sigor@sysoev.ru int mevents;
29512Sigor@sysoev.ru
29612Sigor@sysoev.ru nxt_pollset_change_t *changes;
29712Sigor@sysoev.ru struct poll_ctl *write_changes;
29812Sigor@sysoev.ru struct pollfd *events;
29912Sigor@sysoev.ru nxt_lvlhsh_t fd_hash;
30012Sigor@sysoev.ru } nxt_pollset_engine_t;
30112Sigor@sysoev.ru
30212Sigor@sysoev.ru extern const nxt_event_interface_t nxt_pollset_engine;
30312Sigor@sysoev.ru
30412Sigor@sysoev.ru #endif
30512Sigor@sysoev.ru
30612Sigor@sysoev.ru
30712Sigor@sysoev.ru typedef struct {
30812Sigor@sysoev.ru uint8_t op;
30912Sigor@sysoev.ru short events;
31012Sigor@sysoev.ru nxt_fd_event_t *event;
31112Sigor@sysoev.ru } nxt_poll_change_t;
31212Sigor@sysoev.ru
31312Sigor@sysoev.ru
31412Sigor@sysoev.ru typedef struct {
31512Sigor@sysoev.ru nxt_uint_t max_nfds;
31612Sigor@sysoev.ru nxt_uint_t nfds;
31712Sigor@sysoev.ru
31812Sigor@sysoev.ru nxt_uint_t nchanges;
31912Sigor@sysoev.ru nxt_uint_t mchanges;
32012Sigor@sysoev.ru
32112Sigor@sysoev.ru nxt_poll_change_t *changes;
32212Sigor@sysoev.ru struct pollfd *set;
32312Sigor@sysoev.ru
32412Sigor@sysoev.ru nxt_lvlhsh_t fd_hash;
32512Sigor@sysoev.ru } nxt_poll_engine_t;
32612Sigor@sysoev.ru
32712Sigor@sysoev.ru extern const nxt_event_interface_t nxt_poll_engine;
32812Sigor@sysoev.ru
32912Sigor@sysoev.ru
33012Sigor@sysoev.ru typedef struct {
33112Sigor@sysoev.ru int nfds;
33212Sigor@sysoev.ru uint32_t update_nfds; /* 1 bit */
33312Sigor@sysoev.ru
33412Sigor@sysoev.ru nxt_fd_event_t **events;
33512Sigor@sysoev.ru
33612Sigor@sysoev.ru fd_set main_read_fd_set;
33712Sigor@sysoev.ru fd_set main_write_fd_set;
33812Sigor@sysoev.ru fd_set work_read_fd_set;
33912Sigor@sysoev.ru fd_set work_write_fd_set;
34012Sigor@sysoev.ru } nxt_select_engine_t;
34112Sigor@sysoev.ru
34212Sigor@sysoev.ru extern const nxt_event_interface_t nxt_select_engine;
34312Sigor@sysoev.ru
34412Sigor@sysoev.ru
34512Sigor@sysoev.ru nxt_int_t nxt_fd_event_hash_add(nxt_lvlhsh_t *lvlhsh, nxt_fd_t fd,
34612Sigor@sysoev.ru nxt_fd_event_t *ev);
34712Sigor@sysoev.ru void *nxt_fd_event_hash_get(nxt_task_t *task, nxt_lvlhsh_t *lvlhsh,
34812Sigor@sysoev.ru nxt_fd_t fd);
34912Sigor@sysoev.ru void nxt_fd_event_hash_delete(nxt_task_t *task, nxt_lvlhsh_t *lvlhsh,
35012Sigor@sysoev.ru nxt_fd_t fd, nxt_bool_t ignore);
35112Sigor@sysoev.ru void nxt_fd_event_hash_destroy(nxt_lvlhsh_t *lvlhsh);
35212Sigor@sysoev.ru
35312Sigor@sysoev.ru
3542084Salx.manpages@gmail.com #define nxt_fd_event_disable(engine, ev) \
35512Sigor@sysoev.ru (engine)->event.disable(engine, ev)
35612Sigor@sysoev.ru
35712Sigor@sysoev.ru
3582084Salx.manpages@gmail.com #define nxt_fd_event_delete(engine, ev) \
35953Sigor@sysoev.ru (engine)->event.delete(engine, ev)
36053Sigor@sysoev.ru
36153Sigor@sysoev.ru
3622084Salx.manpages@gmail.com #define nxt_fd_event_close(engine, ev) \
36312Sigor@sysoev.ru (engine)->event.close(engine, ev)
36412Sigor@sysoev.ru
36512Sigor@sysoev.ru
3662084Salx.manpages@gmail.com #define nxt_fd_event_enable_read(engine, ev) \
36712Sigor@sysoev.ru (engine)->event.enable_read(engine, ev)
36812Sigor@sysoev.ru
36912Sigor@sysoev.ru
3702084Salx.manpages@gmail.com #define nxt_fd_event_enable_write(engine, ev) \
37112Sigor@sysoev.ru (engine)->event.enable_write(engine, ev)
37212Sigor@sysoev.ru
37312Sigor@sysoev.ru
3742084Salx.manpages@gmail.com #define nxt_fd_event_disable_read(engine, ev) \
37512Sigor@sysoev.ru (engine)->event.disable_read(engine, ev)
37612Sigor@sysoev.ru
37712Sigor@sysoev.ru
3782084Salx.manpages@gmail.com #define nxt_fd_event_disable_write(engine, ev) \
37912Sigor@sysoev.ru (engine)->event.disable_write(engine, ev)
38012Sigor@sysoev.ru
38112Sigor@sysoev.ru
3822084Salx.manpages@gmail.com #define nxt_fd_event_block_read(engine, ev) \
38312Sigor@sysoev.ru do { \
38412Sigor@sysoev.ru if (nxt_fd_event_is_active((ev)->read)) { \
38512Sigor@sysoev.ru (engine)->event.block_read(engine, ev); \
38612Sigor@sysoev.ru } \
38712Sigor@sysoev.ru } while (0)
38812Sigor@sysoev.ru
38912Sigor@sysoev.ru
3902084Salx.manpages@gmail.com #define nxt_fd_event_block_write(engine, ev) \
39112Sigor@sysoev.ru do { \
39212Sigor@sysoev.ru if (nxt_fd_event_is_active((ev)->write)) { \
39312Sigor@sysoev.ru (engine)->event.block_write(engine, ev); \
39412Sigor@sysoev.ru } \
39512Sigor@sysoev.ru } while (0)
39612Sigor@sysoev.ru
39712Sigor@sysoev.ru
3982084Salx.manpages@gmail.com #define nxt_fd_event_oneshot_read(engine, ev) \
39912Sigor@sysoev.ru (engine)->event.oneshot_read(engine, ev)
40012Sigor@sysoev.ru
40112Sigor@sysoev.ru
4022084Salx.manpages@gmail.com #define nxt_fd_event_oneshot_write(engine, ev) \
40312Sigor@sysoev.ru (engine)->event.oneshot_write(engine, ev)
40412Sigor@sysoev.ru
40512Sigor@sysoev.ru
4062084Salx.manpages@gmail.com #define nxt_fd_event_enable_accept(engine, ev) \
40712Sigor@sysoev.ru (engine)->event.enable_accept(engine, ev)
40812Sigor@sysoev.ru
4090Sigor@sysoev.ru
4100Sigor@sysoev.ru #define NXT_ENGINE_FIBERS 1
4110Sigor@sysoev.ru
4120Sigor@sysoev.ru
4130Sigor@sysoev.ru typedef struct {
4140Sigor@sysoev.ru nxt_fd_t fds[2];
41512Sigor@sysoev.ru nxt_fd_event_t event;
4160Sigor@sysoev.ru } nxt_event_engine_pipe_t;
4170Sigor@sysoev.ru
4180Sigor@sysoev.ru
4190Sigor@sysoev.ru struct nxt_event_engine_s {
42012Sigor@sysoev.ru nxt_task_t task;
42112Sigor@sysoev.ru
42212Sigor@sysoev.ru union {
42312Sigor@sysoev.ru nxt_poll_engine_t poll;
42412Sigor@sysoev.ru nxt_select_engine_t select;
42512Sigor@sysoev.ru
42612Sigor@sysoev.ru #if (NXT_HAVE_KQUEUE)
42712Sigor@sysoev.ru nxt_kqueue_engine_t kqueue;
42812Sigor@sysoev.ru #endif
42912Sigor@sysoev.ru #if (NXT_HAVE_EPOLL)
43012Sigor@sysoev.ru nxt_epoll_engine_t epoll;
43112Sigor@sysoev.ru #endif
43212Sigor@sysoev.ru #if (NXT_HAVE_EVENTPORT)
43312Sigor@sysoev.ru nxt_eventport_engine_t eventport;
43412Sigor@sysoev.ru #endif
43512Sigor@sysoev.ru #if (NXT_HAVE_DEVPOLL)
43612Sigor@sysoev.ru nxt_devpoll_engine_t devpoll;
43712Sigor@sysoev.ru #endif
43812Sigor@sysoev.ru #if (NXT_HAVE_POLLSET)
43912Sigor@sysoev.ru nxt_pollset_engine_t pollset;
44012Sigor@sysoev.ru #endif
44112Sigor@sysoev.ru } u;
4420Sigor@sysoev.ru
4436Sigor@sysoev.ru nxt_timers_t timers;
4440Sigor@sysoev.ru
4454Sigor@sysoev.ru nxt_work_queue_cache_t work_queue_cache;
4464Sigor@sysoev.ru nxt_work_queue_t *current_work_queue;
4474Sigor@sysoev.ru nxt_work_queue_t fast_work_queue;
4480Sigor@sysoev.ru nxt_work_queue_t accept_work_queue;
4490Sigor@sysoev.ru nxt_work_queue_t read_work_queue;
4500Sigor@sysoev.ru nxt_work_queue_t socket_work_queue;
4510Sigor@sysoev.ru nxt_work_queue_t connect_work_queue;
4520Sigor@sysoev.ru nxt_work_queue_t write_work_queue;
4530Sigor@sysoev.ru nxt_work_queue_t shutdown_work_queue;
4540Sigor@sysoev.ru nxt_work_queue_t close_work_queue;
4550Sigor@sysoev.ru
4564Sigor@sysoev.ru nxt_locked_work_queue_t locked_work_queue;
4570Sigor@sysoev.ru
45812Sigor@sysoev.ru nxt_event_interface_t event;
45912Sigor@sysoev.ru
46012Sigor@sysoev.ru /*
46112Sigor@sysoev.ru * A pipe to pass event signals to the engine, if the engine's
46212Sigor@sysoev.ru * underlying event facility does not support user events.
46312Sigor@sysoev.ru */
46412Sigor@sysoev.ru nxt_event_engine_pipe_t *pipe;
46512Sigor@sysoev.ru
4660Sigor@sysoev.ru nxt_event_signals_t *signals;
4670Sigor@sysoev.ru
4680Sigor@sysoev.ru nxt_fiber_main_t *fibers;
4690Sigor@sysoev.ru
47012Sigor@sysoev.ru /* The engine ID, the main engine has ID 0. */
47112Sigor@sysoev.ru uint32_t id;
47212Sigor@sysoev.ru
4730Sigor@sysoev.ru uint8_t shutdown; /* 1 bit */
4740Sigor@sysoev.ru
47520Sigor@sysoev.ru uint32_t batch;
4760Sigor@sysoev.ru uint32_t connections;
4770Sigor@sysoev.ru uint32_t max_connections;
4780Sigor@sysoev.ru
47953Sigor@sysoev.ru nxt_port_t *port;
48063Sigor@sysoev.ru nxt_mp_t *mem_pool;
48153Sigor@sysoev.ru nxt_queue_t joints;
4820Sigor@sysoev.ru nxt_queue_t listen_connections;
4830Sigor@sysoev.ru nxt_queue_t idle_connections;
484337Sigor@sysoev.ru nxt_array_t *mem_cache;
48553Sigor@sysoev.ru
4862185Svbart@nginx.com nxt_atomic_uint_t accepted_conns_cnt;
4872185Svbart@nginx.com nxt_atomic_uint_t idle_conns_cnt;
4882185Svbart@nginx.com nxt_atomic_uint_t closed_conns_cnt;
489*2186Sz.hong@f5.com nxt_atomic_uint_t requests_cnt;
4902185Svbart@nginx.com
49153Sigor@sysoev.ru nxt_queue_link_t link;
492115Sigor@sysoev.ru // STUB: router link
493115Sigor@sysoev.ru nxt_queue_link_t link0;
4940Sigor@sysoev.ru };
4950Sigor@sysoev.ru
4960Sigor@sysoev.ru
49720Sigor@sysoev.ru NXT_EXPORT nxt_event_engine_t *nxt_event_engine_create(nxt_task_t *task,
49812Sigor@sysoev.ru const nxt_event_interface_t *interface, const nxt_sig_event_t *signals,
4990Sigor@sysoev.ru nxt_uint_t flags, nxt_uint_t batch);
50020Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_event_engine_change(nxt_event_engine_t *engine,
50120Sigor@sysoev.ru const nxt_event_interface_t *interface, nxt_uint_t batch);
5020Sigor@sysoev.ru NXT_EXPORT void nxt_event_engine_free(nxt_event_engine_t *engine);
5030Sigor@sysoev.ru NXT_EXPORT void nxt_event_engine_start(nxt_event_engine_t *engine);
5040Sigor@sysoev.ru
5050Sigor@sysoev.ru NXT_EXPORT void nxt_event_engine_post(nxt_event_engine_t *engine,
5064Sigor@sysoev.ru nxt_work_t *work);
5070Sigor@sysoev.ru NXT_EXPORT void nxt_event_engine_signal(nxt_event_engine_t *engine,
5080Sigor@sysoev.ru nxt_uint_t signo);
5090Sigor@sysoev.ru
5101266Sigor@sysoev.ru #define NXT_EVENT_ENGINE_NO_MEM_HINT 255
5111266Sigor@sysoev.ru
5121266Sigor@sysoev.ru void *nxt_event_engine_mem_alloc(nxt_event_engine_t *engine, uint8_t *hint,
513337Sigor@sysoev.ru size_t size);
5141266Sigor@sysoev.ru void nxt_event_engine_mem_free(nxt_event_engine_t *engine, uint8_t hint,
5151266Sigor@sysoev.ru void *p, size_t size);
5161267Sigor@sysoev.ru void *nxt_event_engine_buf_mem_alloc(nxt_event_engine_t *engine, size_t size);
5171267Sigor@sysoev.ru void nxt_event_engine_buf_mem_free(nxt_event_engine_t *engine, nxt_buf_t *b);
5181267Sigor@sysoev.ru void nxt_event_engine_buf_mem_completion(nxt_task_t *task, void *obj,
5191267Sigor@sysoev.ru void *data);
520337Sigor@sysoev.ru
5210Sigor@sysoev.ru
5220Sigor@sysoev.ru nxt_inline nxt_event_engine_t *
nxt_thread_event_engine(void)5230Sigor@sysoev.ru nxt_thread_event_engine(void)
5240Sigor@sysoev.ru {
5250Sigor@sysoev.ru nxt_thread_t *thr;
5260Sigor@sysoev.ru
5270Sigor@sysoev.ru thr = nxt_thread();
5280Sigor@sysoev.ru return thr->engine;
5290Sigor@sysoev.ru }
5300Sigor@sysoev.ru
531165Smax.romanov@nginx.com #if (NXT_DEBUG)
532165Smax.romanov@nginx.com
533165Smax.romanov@nginx.com NXT_EXPORT void nxt_event_engine_thread_adopt(nxt_event_engine_t *engine);
534165Smax.romanov@nginx.com
535165Smax.romanov@nginx.com #else
536165Smax.romanov@nginx.com
537165Smax.romanov@nginx.com #define nxt_event_engine_thread_adopt(_engine)
538165Smax.romanov@nginx.com
539165Smax.romanov@nginx.com #endif
540165Smax.romanov@nginx.com
5410Sigor@sysoev.ru
5420Sigor@sysoev.ru #endif /* _NXT_EVENT_ENGINE_H_INCLUDED_ */
543