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 354*2084Salx.manpages@gmail.com #define nxt_fd_event_disable(engine, ev) \ 35512Sigor@sysoev.ru (engine)->event.disable(engine, ev) 35612Sigor@sysoev.ru 35712Sigor@sysoev.ru 358*2084Salx.manpages@gmail.com #define nxt_fd_event_delete(engine, ev) \ 35953Sigor@sysoev.ru (engine)->event.delete(engine, ev) 36053Sigor@sysoev.ru 36153Sigor@sysoev.ru 362*2084Salx.manpages@gmail.com #define nxt_fd_event_close(engine, ev) \ 36312Sigor@sysoev.ru (engine)->event.close(engine, ev) 36412Sigor@sysoev.ru 36512Sigor@sysoev.ru 366*2084Salx.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 370*2084Salx.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 374*2084Salx.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 378*2084Salx.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 382*2084Salx.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 390*2084Salx.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 398*2084Salx.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 402*2084Salx.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 406*2084Salx.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 48653Sigor@sysoev.ru nxt_queue_link_t link; 487115Sigor@sysoev.ru // STUB: router link 488115Sigor@sysoev.ru nxt_queue_link_t link0; 4890Sigor@sysoev.ru }; 4900Sigor@sysoev.ru 4910Sigor@sysoev.ru 49220Sigor@sysoev.ru NXT_EXPORT nxt_event_engine_t *nxt_event_engine_create(nxt_task_t *task, 49312Sigor@sysoev.ru const nxt_event_interface_t *interface, const nxt_sig_event_t *signals, 4940Sigor@sysoev.ru nxt_uint_t flags, nxt_uint_t batch); 49520Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_event_engine_change(nxt_event_engine_t *engine, 49620Sigor@sysoev.ru const nxt_event_interface_t *interface, nxt_uint_t batch); 4970Sigor@sysoev.ru NXT_EXPORT void nxt_event_engine_free(nxt_event_engine_t *engine); 4980Sigor@sysoev.ru NXT_EXPORT void nxt_event_engine_start(nxt_event_engine_t *engine); 4990Sigor@sysoev.ru 5000Sigor@sysoev.ru NXT_EXPORT void nxt_event_engine_post(nxt_event_engine_t *engine, 5014Sigor@sysoev.ru nxt_work_t *work); 5020Sigor@sysoev.ru NXT_EXPORT void nxt_event_engine_signal(nxt_event_engine_t *engine, 5030Sigor@sysoev.ru nxt_uint_t signo); 5040Sigor@sysoev.ru 5051266Sigor@sysoev.ru #define NXT_EVENT_ENGINE_NO_MEM_HINT 255 5061266Sigor@sysoev.ru 5071266Sigor@sysoev.ru void *nxt_event_engine_mem_alloc(nxt_event_engine_t *engine, uint8_t *hint, 508337Sigor@sysoev.ru size_t size); 5091266Sigor@sysoev.ru void nxt_event_engine_mem_free(nxt_event_engine_t *engine, uint8_t hint, 5101266Sigor@sysoev.ru void *p, size_t size); 5111267Sigor@sysoev.ru void *nxt_event_engine_buf_mem_alloc(nxt_event_engine_t *engine, size_t size); 5121267Sigor@sysoev.ru void nxt_event_engine_buf_mem_free(nxt_event_engine_t *engine, nxt_buf_t *b); 5131267Sigor@sysoev.ru void nxt_event_engine_buf_mem_completion(nxt_task_t *task, void *obj, 5141267Sigor@sysoev.ru void *data); 515337Sigor@sysoev.ru 5160Sigor@sysoev.ru 5170Sigor@sysoev.ru nxt_inline nxt_event_engine_t * 5180Sigor@sysoev.ru nxt_thread_event_engine(void) 5190Sigor@sysoev.ru { 5200Sigor@sysoev.ru nxt_thread_t *thr; 5210Sigor@sysoev.ru 5220Sigor@sysoev.ru thr = nxt_thread(); 5230Sigor@sysoev.ru return thr->engine; 5240Sigor@sysoev.ru } 5250Sigor@sysoev.ru 526165Smax.romanov@nginx.com #if (NXT_DEBUG) 527165Smax.romanov@nginx.com 528165Smax.romanov@nginx.com NXT_EXPORT void nxt_event_engine_thread_adopt(nxt_event_engine_t *engine); 529165Smax.romanov@nginx.com 530165Smax.romanov@nginx.com #else 531165Smax.romanov@nginx.com 532165Smax.romanov@nginx.com #define nxt_event_engine_thread_adopt(_engine) 533165Smax.romanov@nginx.com 534165Smax.romanov@nginx.com #endif 535165Smax.romanov@nginx.com 5360Sigor@sysoev.ru 5370Sigor@sysoev.ru #endif /* _NXT_EVENT_ENGINE_H_INCLUDED_ */ 538