3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
8 #include <ngx_config.h>
10 #include <ngx_event.h>
13 extern int ngx_eventfd
;
14 extern aio_context_t ngx_aio_ctx
;
17 static void ngx_file_aio_event_handler(ngx_event_t
*ev
);
21 io_submit(aio_context_t ctx
, long n
, struct iocb
**paiocb
)
23 return syscall(SYS_io_submit
, ctx
, n
, paiocb
);
28 ngx_file_aio_read(ngx_file_t
*file
, u_char
*buf
, size_t size
, off_t offset
,
32 struct iocb
*piocb
[1];
37 return ngx_read_file(file
, buf
, size
, offset
);
43 aio
= ngx_pcalloc(pool
, sizeof(ngx_event_aio_t
));
50 aio
->event
.data
= aio
;
52 aio
->event
.log
= file
->log
;
59 ngx_log_error(NGX_LOG_ALERT
, file
->log
, 0,
60 "second aio post for \"%V\"", &file
->name
);
64 ngx_log_debug4(NGX_LOG_DEBUG_CORE
, file
->log
, 0,
65 "aio complete:%d @%O:%z %V",
66 ev
->complete
, offset
, size
, &file
->name
);
77 ngx_set_errno(-aio
->res
);
79 ngx_log_error(NGX_LOG_CRIT
, file
->log
, ngx_errno
,
80 "aio read \"%s\" failed", file
->name
.data
);
85 ngx_memzero(&aio
->aiocb
, sizeof(struct iocb
));
87 aio
->aiocb
.aio_data
= (uint64_t) (uintptr_t) ev
;
88 aio
->aiocb
.aio_lio_opcode
= IOCB_CMD_PREAD
;
89 aio
->aiocb
.aio_fildes
= file
->fd
;
90 aio
->aiocb
.aio_buf
= (uint64_t) (uintptr_t) buf
;
91 aio
->aiocb
.aio_nbytes
= size
;
92 aio
->aiocb
.aio_offset
= offset
;
93 aio
->aiocb
.aio_flags
= IOCB_FLAG_RESFD
;
94 aio
->aiocb
.aio_resfd
= ngx_eventfd
;
96 ev
->handler
= ngx_file_aio_event_handler
;
98 piocb
[0] = &aio
->aiocb
;
100 if (io_submit(ngx_aio_ctx
, 1, piocb
) == 1) {
110 if (err
== NGX_EAGAIN
) {
111 return ngx_read_file(file
, buf
, size
, offset
);
114 ngx_log_error(NGX_LOG_CRIT
, file
->log
, err
,
115 "io_submit(\"%V\") failed", &file
->name
);
117 if (err
== NGX_ENOSYS
) {
119 return ngx_read_file(file
, buf
, size
, offset
);
127 ngx_file_aio_event_handler(ngx_event_t
*ev
)
129 ngx_event_aio_t
*aio
;
133 ngx_log_debug2(NGX_LOG_DEBUG_CORE
, ev
->log
, 0,
134 "aio event handler fd:%d %V", aio
->fd
, &aio
->file
->name
);