Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ngx_aio_write.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 
13 extern int ngx_kqueue;
14 
15 
16 ssize_t
17 ngx_aio_write(ngx_connection_t *c, u_char *buf, size_t size)
18 {
19  int n;
20  ngx_event_t *wev;
21 
22  wev = c->write;
23 
24  if (!wev->ready) {
25  return NGX_AGAIN;
26  }
27 
29  "aio: wev->complete: %d", wev->complete);
30 
31  if (!wev->complete) {
32  ngx_memzero(&wev->aiocb, sizeof(struct aiocb));
33 
34  wev->aiocb.aio_fildes = c->fd;
35  wev->aiocb.aio_buf = buf;
36  wev->aiocb.aio_nbytes = size;
37 
38 #if (NGX_HAVE_KQUEUE)
39  wev->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue;
40  wev->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
41  wev->aiocb.aio_sigevent.sigev_value.sigval_ptr = wev;
42 #endif
43 
44  if (aio_write(&wev->aiocb) == -1) {
46  "aio_write() failed");
47  return NGX_ERROR;
48  }
49 
50  ngx_log_debug0(NGX_LOG_DEBUG_EVENT, wev->log, 0, "aio_write: OK");
51 
52  wev->active = 1;
53  wev->ready = 0;
54  }
55 
56  wev->complete = 0;
57 
58  n = aio_error(&wev->aiocb);
59  if (n == -1) {
60  ngx_log_error(NGX_LOG_CRIT, wev->log, ngx_errno, "aio_error() failed");
61  wev->error = 1;
62  return NGX_ERROR;
63  }
64 
65  if (n != 0) {
66  if (n == NGX_EINPROGRESS) {
67  if (wev->ready) {
69  "aio_write() still in progress");
70  wev->ready = 0;
71  }
72  return NGX_AGAIN;
73  }
74 
75  ngx_log_error(NGX_LOG_CRIT, wev->log, n, "aio_write() failed");
76  wev->error = 1;
77  wev->ready = 0;
78 
79 #if 1
80  n = aio_return(&wev->aiocb);
81  if (n == -1) {
83  "aio_return() failed");
84  }
85 
86  ngx_log_error(NGX_LOG_CRIT, wev->log, n, "aio_return() %d", n);
87 #endif
88 
89  return NGX_ERROR;
90  }
91 
92  n = aio_return(&wev->aiocb);
93  if (n == -1) {
95  "aio_return() failed");
96 
97  wev->error = 1;
98  wev->ready = 0;
99  return NGX_ERROR;
100  }
101 
102 
103  ngx_log_debug1(NGX_LOG_DEBUG_EVENT, wev->log, 0, "aio_write: %d", n);
104 
105  wev->active = 0;
106  wev->ready = 1;
107 
108  return n;
109 }