Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ngx_aio_module.c
Go to the documentation of this file.
1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) Nginx, Inc.
5  */
6 
7 
8 #include <ngx_config.h>
9 #include <ngx_core.h>
10 #include <ngx_event.h>
11 
12 
14 
15 
16 static ngx_int_t ngx_aio_init(ngx_cycle_t *cycle, ngx_msec_t timer);
17 static void ngx_aio_done(ngx_cycle_t *cycle);
18 static ngx_int_t ngx_aio_add_event(ngx_event_t *ev, ngx_int_t event,
19  ngx_uint_t flags);
20 static ngx_int_t ngx_aio_del_event(ngx_event_t *ev, ngx_int_t event,
21  ngx_uint_t flags);
22 static ngx_int_t ngx_aio_del_connection(ngx_connection_t *c, ngx_uint_t flags);
23 static ngx_int_t ngx_aio_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
24  ngx_uint_t flags);
25 
26 
30  NULL,
33  0
34 };
35 
36 
37 static ngx_str_t aio_name = ngx_string("aio");
38 
40  &aio_name,
41  NULL, /* create configuration */
42  NULL, /* init configuration */
43 
44  {
45  ngx_aio_add_event, /* add an event */
46  ngx_aio_del_event, /* delete an event */
47  NULL, /* enable an event */
48  NULL, /* disable an event */
49  NULL, /* add an connection */
50  ngx_aio_del_connection, /* delete an connection */
51  NULL, /* process the changes */
52  ngx_aio_process_events, /* process the events */
53  ngx_aio_init, /* init the events */
54  ngx_aio_done /* done the events */
55  }
56 
57 };
58 
61  &ngx_aio_module_ctx, /* module context */
62  NULL, /* module directives */
63  NGX_EVENT_MODULE, /* module type */
64  NULL, /* init master */
65  NULL, /* init module */
66  NULL, /* init process */
67  NULL, /* init thread */
68  NULL, /* exit thread */
69  NULL, /* exit process */
70  NULL, /* exit master */
72 };
73 
74 
75 #if (NGX_HAVE_KQUEUE)
76 
77 static ngx_int_t
78 ngx_aio_init(ngx_cycle_t *cycle, ngx_msec_t timer)
79 {
80  if (ngx_kqueue_module_ctx.actions.init(cycle, timer) == NGX_ERROR) {
81  return NGX_ERROR;
82  }
83 
85 
87  ngx_event_actions = ngx_aio_module_ctx.actions;
88 
89 
90  return NGX_OK;
91 }
92 
93 
94 static void
95 ngx_aio_done(ngx_cycle_t *cycle)
96 {
97  ngx_kqueue_module_ctx.actions.done(cycle);
98 }
99 
100 
101 /* the event adding and deleting are needed for the listening sockets */
102 
103 static ngx_int_t
104 ngx_aio_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
105 {
106  return ngx_kqueue_module_ctx.actions.add(ev, event, flags);
107 }
108 
109 
110 static ngx_int_t
111 ngx_aio_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
112 {
113  return ngx_kqueue_module_ctx.actions.del(ev, event, flags);
114 }
115 
116 
117 static ngx_int_t
118 ngx_aio_del_connection(ngx_connection_t *c, ngx_uint_t flags)
119 {
120  int rc;
121 
122  if (c->read->active == 0 && c->write->active == 0) {
123  return NGX_OK;
124  }
125 
126  if (flags & NGX_CLOSE_EVENT) {
127  return NGX_OK;
128  }
129 
130  rc = aio_cancel(c->fd, NULL);
131 
132  ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_cancel: %d", rc);
133 
134  if (rc == AIO_CANCELED) {
135  c->read->active = 0;
136  c->write->active = 0;
137  return NGX_OK;
138  }
139 
140  if (rc == AIO_ALLDONE) {
141  c->read->active = 0;
142  c->write->active = 0;
144  "aio_cancel() returned AIO_ALLDONE");
145  return NGX_OK;
146  }
147 
148  if (rc == -1) {
150  "aio_cancel() failed");
151  return NGX_ERROR;
152  }
153 
154  if (rc == AIO_NOTCANCELED) {
156  "aio_cancel() returned AIO_NOTCANCELED");
157 
158  return NGX_ERROR;
159  }
160 
161  return NGX_OK;
162 }
163 
164 
165 static ngx_int_t
166 ngx_aio_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
167 {
168  return ngx_kqueue_module_ctx.actions.process_events(cycle, timer, flags);
169 }
170 
171 #endif /* NGX_HAVE_KQUEUE */