… | |
… | |
262 | inline_size |
262 | inline_size |
263 | void |
263 | void |
264 | linuxaio_get_events (EV_P_ ev_tstamp timeout) |
264 | linuxaio_get_events (EV_P_ ev_tstamp timeout) |
265 | { |
265 | { |
266 | struct timespec ts; |
266 | struct timespec ts; |
267 | struct io_event ioev; |
267 | struct io_event ioev[1]; |
268 | int res; |
268 | int res; |
269 | |
269 | |
270 | if (linuxaio_get_events_from_ring (EV_A)) |
270 | if (linuxaio_get_events_from_ring (EV_A)) |
271 | return; |
271 | return; |
272 | |
272 | |
… | |
… | |
275 | /* if the ring buffer changes layout, but so be it */ |
275 | /* if the ring buffer changes layout, but so be it */ |
276 | |
276 | |
277 | ts.tv_sec = (long)timeout; |
277 | ts.tv_sec = (long)timeout; |
278 | ts.tv_nsec = (long)((timeout - ts.tv_sec) * 1e9); |
278 | ts.tv_nsec = (long)((timeout - ts.tv_sec) * 1e9); |
279 | |
279 | |
280 | res = ev_io_getevents (linuxaio_ctx, 1, 1, &ioev, &ts); |
280 | res = ev_io_getevents (linuxaio_ctx, 1, sizeof (ioev) / sizeof (ioev [0]), ioev, &ts); |
281 | |
281 | |
282 | if (res < 0) |
282 | if (res < 0) |
283 | if (errno == EINTR) |
283 | if (errno == EINTR) |
284 | /* ignored */; |
284 | /* ignored */; |
285 | else |
285 | else |
286 | ev_syserr ("(libev) linuxaio io_getevents"); |
286 | ev_syserr ("(libev) linuxaio io_getevents"); |
287 | else if (res) |
287 | else if (res) |
288 | { |
288 | { |
289 | /* at least one event received, handle it and any remaining ones in the ring buffer */ |
289 | /* at least one event received, handle it and any remaining ones in the ring buffer */ |
290 | linuxaio_parse_events (EV_A_ &ioev, 1); |
290 | linuxaio_parse_events (EV_A_ ioev, res); |
291 | linuxaio_get_events_from_ring (EV_A); |
291 | linuxaio_get_events_from_ring (EV_A); |
292 | } |
292 | } |
293 | } |
293 | } |
294 | |
294 | |
295 | #if EPOLL_FALLBACK |
295 | #if EPOLL_FALLBACK |