From ab529434ab926c2e6461d34ac258a467c0e1374c Mon Sep 17 00:00:00 2001 From: Manuel Penschuck Date: Sun, 24 Apr 2016 11:51:50 +0200 Subject: [PATCH] Fix interrupted syscall in linuxaio queue --- lib/io/linuxaio_queue.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/io/linuxaio_queue.cpp b/lib/io/linuxaio_queue.cpp index e3610c378..6fec4dc59 100644 --- a/lib/io/linuxaio_queue.cpp +++ b/lib/io/linuxaio_queue.cpp @@ -232,10 +232,19 @@ void linuxaio_queue::wait_requests() break; // wait for at least one of them to finish - long num_events = syscall(SYS_io_getevents, context, 1, max_events, events, NULL); - if (num_events < 0) { - STXXL_THROW_ERRNO(io_error, "linuxaio_queue::wait_requests" - " io_getevents() nr_events=" << max_events); + long num_events; + while(1) { + num_events = syscall(SYS_io_getevents, context, 1, max_events, events, NULL); + if (num_events < 0) { + if (errno == EINTR) { + // io_getevents may return prematurely in case a signal is received + continue; + } + + STXXL_THROW_ERRNO(io_error, "linuxaio_queue::wait_requests" + " io_getevents() nr_events=" << max_events); + } + break; } num_posted_requests++; // compensate for the one eaten prematurely above