xref: /unit/src/nxt_event_engine.h (revision 0:a63ceefd6ab0)
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     /* The engine ID, the main engine has ID 0. */
27     uint32_t                   id;
28 
29     /*
30      * A pipe to pass event signals to the engine, if the engine's
31      * underlying event facility does not support user events.
32      */
33     nxt_event_engine_pipe_t    *pipe;
34 
35     nxt_work_queue_t           accept_work_queue;
36     nxt_work_queue_t           read_work_queue;
37     nxt_work_queue_t           socket_work_queue;
38     nxt_work_queue_t           connect_work_queue;
39     nxt_work_queue_t           write_work_queue;
40     nxt_work_queue_t           shutdown_work_queue;
41     nxt_work_queue_t           close_work_queue;
42 
43     nxt_locked_work_queue_t    work_queue;
44 
45     nxt_event_signals_t        *signals;
46 
47     nxt_fiber_main_t           *fibers;
48 
49     uint8_t                    shutdown;  /* 1 bit */
50 
51     uint32_t                   batch;
52     uint32_t                   connections;
53     uint32_t                   max_connections;
54 
55     nxt_queue_t                listen_connections;
56     nxt_queue_t                idle_connections;
57 };
58 
59 
60 NXT_EXPORT nxt_event_engine_t *nxt_event_engine_create(nxt_thread_t *thr,
61     const nxt_event_set_ops_t *event_set, const nxt_event_sig_t *signals,
62     nxt_uint_t flags, nxt_uint_t batch);
63 NXT_EXPORT nxt_int_t nxt_event_engine_change(nxt_thread_t *thr,
64     const nxt_event_set_ops_t *event_set, nxt_uint_t batch);
65 NXT_EXPORT void nxt_event_engine_free(nxt_event_engine_t *engine);
66 NXT_EXPORT void nxt_event_engine_start(nxt_event_engine_t *engine);
67 
68 NXT_EXPORT void nxt_event_engine_post(nxt_event_engine_t *engine,
69     nxt_work_handler_t handler, void *obj, void *data, nxt_log_t *log);
70 NXT_EXPORT void nxt_event_engine_signal(nxt_event_engine_t *engine,
71     nxt_uint_t signo);
72 
73 
74 nxt_inline nxt_event_engine_t *
75 nxt_thread_event_engine(void)
76 {
77     nxt_thread_t  *thr;
78 
79     thr = nxt_thread();
80     return thr->engine;
81 }
82 
83 
84 nxt_inline nxt_work_queue_t *
85 nxt_thread_main_work_queue(void)
86 {
87     nxt_thread_t  *thr;
88 
89     thr = nxt_thread();
90     return &thr->work_queue.main;
91 }
92 
93 
94 #endif /* _NXT_EVENT_ENGINE_H_INCLUDED_ */
95