xref: /unit/src/nxt_event_engine.h (revision 1:fdc027c56872)
1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) NGINX, Inc.
5  */
6 
7 #ifndef _NXT_EVENT_ENGINE_H_INCLUDED_
8 #define _NXT_EVENT_ENGINE_H_INCLUDED_
9 
10 
11 #define NXT_ENGINE_FIBERS      1
12 
13 
14 typedef struct {
15     nxt_fd_t                   fds[2];
16     nxt_event_fd_t             event;
17 } nxt_event_engine_pipe_t;
18 
19 
20 struct nxt_event_engine_s {
21     const nxt_event_set_ops_t  *event;
22     nxt_event_set_t            *event_set;
23 
24     nxt_event_timers_t         timers;
25 
26     nxt_task_t                 task;
27     /* The engine ID, the main engine has ID 0. */
28     uint32_t                   id;
29 
30     /*
31      * A pipe to pass event signals to the engine, if the engine's
32      * underlying event facility does not support user events.
33      */
34     nxt_event_engine_pipe_t    *pipe;
35 
36     nxt_work_queue_t           accept_work_queue;
37     nxt_work_queue_t           read_work_queue;
38     nxt_work_queue_t           socket_work_queue;
39     nxt_work_queue_t           connect_work_queue;
40     nxt_work_queue_t           write_work_queue;
41     nxt_work_queue_t           shutdown_work_queue;
42     nxt_work_queue_t           close_work_queue;
43 
44     nxt_locked_work_queue_t    work_queue;
45 
46     nxt_event_signals_t        *signals;
47 
48     nxt_thread_t               *thread;
49     nxt_fiber_main_t           *fibers;
50 
51     uint8_t                    shutdown;  /* 1 bit */
52 
53     uint32_t                   batch;
54     uint32_t                   connections;
55     uint32_t                   max_connections;
56 
57     nxt_queue_t                listen_connections;
58     nxt_queue_t                idle_connections;
59 };
60 
61 
62 NXT_EXPORT nxt_event_engine_t *nxt_event_engine_create(nxt_thread_t *thr,
63     const nxt_event_set_ops_t *event_set, const nxt_event_sig_t *signals,
64     nxt_uint_t flags, nxt_uint_t batch);
65 NXT_EXPORT nxt_int_t nxt_event_engine_change(nxt_thread_t *thr,
66     nxt_task_t *task, const nxt_event_set_ops_t *event_set, nxt_uint_t batch);
67 NXT_EXPORT void nxt_event_engine_free(nxt_event_engine_t *engine);
68 NXT_EXPORT void nxt_event_engine_start(nxt_event_engine_t *engine);
69 
70 NXT_EXPORT void nxt_event_engine_post(nxt_event_engine_t *engine,
71     nxt_work_handler_t handler, nxt_task_t *task, void *obj, void *data,
72     nxt_log_t *log);
73 NXT_EXPORT void nxt_event_engine_signal(nxt_event_engine_t *engine,
74     nxt_uint_t signo);
75 
76 
77 nxt_inline nxt_event_engine_t *
78 nxt_thread_event_engine(void)
79 {
80     nxt_thread_t  *thr;
81 
82     thr = nxt_thread();
83     return thr->engine;
84 }
85 
86 
87 nxt_inline nxt_work_queue_t *
88 nxt_thread_main_work_queue(void)
89 {
90     nxt_thread_t  *thr;
91 
92     thr = nxt_thread();
93     return &thr->work_queue.main;
94 }
95 
96 
97 #endif /* _NXT_EVENT_ENGINE_H_INCLUDED_ */
98