comparison src/event/ngx_event_aio_write.c @ 59:e8cdc2989cee

nginx-0.0.1-2003-02-06-20:21:13 import
author Igor Sysoev <igor@sysoev.ru>
date Thu, 06 Feb 2003 17:21:13 +0000
parents
children 36d2c25cc9bb
comparison
equal deleted inserted replaced
58:6b13b1cadabe 59:e8cdc2989cee
1
2 #include <ngx_config.h>
3 #include <ngx_core.h>
4 #include <ngx_errno.h>
5 #include <ngx_log.h>
6 #include <ngx_recv.h>
7 #include <ngx_connection.h>
8
9 #if (HAVE_KQUEUE)
10 #include <ngx_kqueue_module.h>
11 #endif
12
13
14 /*
15 The data is ready - 3 syscalls:
16 aio_write(), aio_error(), aio_return()
17 The data is not ready - 4 (kqueue) or 5 syscalls:
18 aio_write(), aio_error(), notifiction,
19 aio_error(), aio_return()
20 aio_cancel(), aio_error()
21 */
22
23 ssize_t ngx_event_aio_write(ngx_connection_t *c, char *buf, size_t size)
24 {
25 int rc, first, canceled;
26 ngx_event_t *ev;
27
28 ev = c->write;
29
30 canceled = 0;
31
32 ngx_log_debug(ev->log, "aio: ev->ready: %d" _ ev->ready);
33 ngx_log_debug(ev->log, "aio: aiocb: %08x" _ &ev->aiocb);
34
35 if (ev->timedout) {
36 ngx_set_socket_errno(NGX_ETIMEDOUT);
37 ngx_log_error(NGX_LOG_ERR, ev->log, 0, "aio_write() timed out");
38
39 rc = aio_cancel(c->fd, &ev->aiocb);
40 if (rc == -1) {
41 ngx_log_error(NGX_LOG_CRIT, ev->log, ngx_errno,
42 "aio_cancel() failed");
43 return NGX_ERROR;
44 }
45
46 ngx_log_debug(ev->log, "aio_cancel: %d" _ rc);
47
48 canceled = 1;
49
50 ev->ready = 1;
51 }
52
53 first = 0;
54
55 if (!ev->ready) {
56 ngx_memzero(&ev->aiocb, sizeof(struct aiocb));
57
58 ev->aiocb.aio_fildes = c->fd;
59 ev->aiocb.aio_buf = buf;
60 ev->aiocb.aio_nbytes = size;
61
62 #if (HAVE_KQUEUE)
63 ev->aiocb.aio_sigevent.sigev_notify_kqueue = kq;
64 ev->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
65 ev->aiocb.aio_sigevent.sigev_value.sigval_ptr = ev;
66 #endif
67
68 if (aio_write(&ev->aiocb) == -1) {
69 ngx_log_error(NGX_LOG_CRIT, ev->log, ngx_errno,
70 "aio_write() failed");
71 return NGX_ERROR;
72 }
73
74 ngx_log_debug(ev->log, "aio_write: OK");
75
76 ev->active = 1;
77 first = 1;
78 }
79
80 ev->ready = 0;
81
82 rc = aio_error(&ev->aiocb);
83 if (rc == -1) {
84 ngx_log_error(NGX_LOG_CRIT, ev->log, ngx_errno, "aio_error() failed");
85 return NGX_ERROR;
86 }
87
88 if (rc != 0) {
89 if (rc == NGX_EINPROGRESS) {
90 if (!first) {
91 ngx_log_error(NGX_LOG_CRIT, ev->log, rc,
92 "aio_write() still in progress");
93 }
94 return NGX_AGAIN;
95 }
96
97 if (rc == NGX_ECANCELED && canceled) {
98 return NGX_ERROR;
99 }
100
101 ngx_log_error(NGX_LOG_CRIT, ev->log, rc, "aio_write() failed");
102 return NGX_ERROR;
103 }
104
105 rc = aio_return(&ev->aiocb);
106 if (rc == -1) {
107 ngx_log_error(NGX_LOG_CRIT, ev->log, ngx_errno, "aio_return() failed");
108
109 return NGX_ERROR;
110 }
111
112 ngx_log_debug(ev->log, "aio_write: %d" _ rc);
113
114 return rc;
115 }