ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/ev_linuxaio.c
(Generate patch)

Comparing libev/ev_linuxaio.c (file contents):
Revision 1.13 by root, Sun Jun 23 23:38:38 2019 UTC vs.
Revision 1.16 by root, Mon Jun 24 00:30:24 2019 UTC

246 { 246 {
247 linuxaio_parse_events (EV_A_ ring->io_events + head, ring->nr - head); 247 linuxaio_parse_events (EV_A_ ring->io_events + head, ring->nr - head);
248 linuxaio_parse_events (EV_A_ ring->io_events, tail); 248 linuxaio_parse_events (EV_A_ ring->io_events, tail);
249 } 249 }
250 250
251 /* TODO: we only need a compiler barrier here, not a read fence */
252 ECB_MEMORY_FENCE_RELEASE;
251 /* as an extension to C, we hope that the volatile will makethis atomic and once-only */ 253 /* as an extension to C, we hope that the volatile will make this atomic and once-only */
252 *(volatile unsigned *)&ring->head = tail; 254 *(volatile unsigned *)&ring->head = tail;
253 /* make sure kernel can see our new head value - probably not required */ 255 /* make sure kernel can see our new head value - probably not required */
254 ECB_MEMORY_FENCE_RELEASE; 256 ECB_MEMORY_FENCE_RELEASE;
255 257
256 return 1; 258 return 1;
336 break; 338 break;
337 } 339 }
338#if EPOLL_FALLBACK 340#if EPOLL_FALLBACK
339 else if (errno == EINVAL) 341 else if (errno == EINVAL)
340 { 342 {
341 /* This hapΓΌpens for unsupported fds, officially, but in my testing, 343 /* This happens for unsupported fds, officially, but in my testing,
342 * also randomly happens for supported fds. We fall back to good old 344 * also randomly happens for supported fds. We fall back to good old
343 * poll() here, under the assumption that this is a very rare case. 345 * poll() here, under the assumption that this is a very rare case.
346 * See https://lore.kernel.org/patchwork/patch/1047453/ for evidence
347 * that the problem is known, but ignored.
344 */ 348 */
345 struct iocb *iocb = linuxaio_submits [submitted]; 349 struct iocb *iocb = linuxaio_submits [submitted];
346 res = 1; /* skip this iocb */ 350 res = 1; /* skip this iocb */
347 351
348 linuxaio_rearm_epoll (EV_A_ iocb, EPOLL_CTL_ADD); 352 linuxaio_rearm_epoll (EV_A_ iocb, EPOLL_CTL_ADD);
404int 408int
405linuxaio_init (EV_P_ int flags) 409linuxaio_init (EV_P_ int flags)
406{ 410{
407 /* would be great to have a nice test for IOCB_CMD_POLL instead */ 411 /* would be great to have a nice test for IOCB_CMD_POLL instead */
408 /* also: test some semi-common fd types, such as files and ttys in recommended_backends */ 412 /* also: test some semi-common fd types, such as files and ttys in recommended_backends */
409 if (ev_linux_version () < 0x041200) /* 4.18 introduced IOCB_CMD_POLL */ 413#if EPOLL_FALLBACK
414 /* 4.19 made epoll work */
415 if (ev_linux_version () < 0x041300)
410 return 0; 416 return 0;
417#else
418 /* 4.18 introduced IOCB_CMD_POLL */
419 if (ev_linux_version () < 0x041200)
420 return 0;
421#endif
411 422
412 linuxaio_ctx = 0; 423 linuxaio_ctx = 0;
413 if (ev_io_setup (EV_LINUXAIO_DEPTH, &linuxaio_ctx) < 0) 424 if (ev_io_setup (EV_LINUXAIO_DEPTH, &linuxaio_ctx) < 0)
414 return 0; 425 return 0;
415 426
421 return 0; 432 return 0;
422 } 433 }
423 434
424 ev_io_init (EV_A_ &linuxaio_epoll_w, linuxaio_epoll_cb, backend_fd, EV_READ); 435 ev_io_init (EV_A_ &linuxaio_epoll_w, linuxaio_epoll_cb, backend_fd, EV_READ);
425 ev_io_start (EV_A_ &linuxaio_epoll_w); 436 ev_io_start (EV_A_ &linuxaio_epoll_w);
437 ev_unref (EV_A); /* watcher should not keep loop alive */
426#endif 438#endif
427 439
428 backend_modify = linuxaio_modify; 440 backend_modify = linuxaio_modify;
429 backend_poll = linuxaio_poll; 441 backend_poll = linuxaio_poll;
430 442
466 ev_syserr ("(libev) linuxaio epoll_create"); 478 ev_syserr ("(libev) linuxaio epoll_create");
467 479
468 ev_io_stop (EV_A_ &linuxaio_epoll_w); 480 ev_io_stop (EV_A_ &linuxaio_epoll_w);
469 ev_io_init (EV_A_ &linuxaio_epoll_w, linuxaio_epoll_cb, backend_fd, EV_READ); 481 ev_io_init (EV_A_ &linuxaio_epoll_w, linuxaio_epoll_cb, backend_fd, EV_READ);
470 ev_io_start (EV_A_ &linuxaio_epoll_w); 482 ev_io_start (EV_A_ &linuxaio_epoll_w);
471 ev_unref (EV_A); /* watcher should not keep loop alive */
472#endif 483#endif
473 484
474 fd_rearm_all (EV_A); 485 fd_rearm_all (EV_A);
475} 486}
476 487

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines