RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: j...@rpm5.org Module: rpm Date: 30-May-2017 10:31:19 Branch: rpm-5_4 Handle: 2017053008311900 Modified files: (Branch: rpm-5_4) rpm/rpmio msqio.c Log: - msqio: rescale loop timeout wait on ETIMEDOUT/EAGAIN. Summary: Revision Changes Path 1.1.2.23 +9 -1 rpm/rpmio/msqio.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/rpmio/msqio.c ============================================================================ $ cvs diff -u -r1.1.2.22 -r1.1.2.23 msqio.c --- rpm/rpmio/msqio.c 30 May 2017 08:17:40 -0000 1.1.2.22 +++ rpm/rpmio/msqio.c 30 May 2017 08:31:19 -0000 1.1.2.23 @@ -819,11 +819,11 @@ static ssize_t rpmmsqReaderLoop(rpmmsq msq, int op, char *b, size_t nb, unsigned *priop) { + struct timespec ts = { 0, 1000 }; /* XXX move into msq for persistence? */ ssize_t rc; errno = 0; do { - struct timespec ts = { 0, 1000 }; switch (op) { case LIO_READ: @@ -838,18 +838,26 @@ break; } /* Retry operation on timeouts and queue full. */ +#define NSEC (1000*1000*1000) if (rc < 0) { switch (errno) { case ETIMEDOUT: /* XXX mq_timedreceive() */ msq->ntimeout++; Z(nanosleep(&ts, NULL)); + ts.tv_nsec <<= 1; + ts.tv_sec += ts.tv_nsec / NSEC; + ts.tv_nsec %= NSEC; continue; case EAGAIN: /* XXX O_NONBLOCK */ msq->nagain++; Z(nanosleep(&ts, NULL)); + ts.tv_nsec <<= 1; + ts.tv_sec += ts.tv_nsec / NSEC; + ts.tv_nsec %= NSEC; continue; } } +#undef NSEC break; } while (rc < 0); @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org