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:17:41 Branch: rpm-5_4 Handle: 2017053008174001 Modified files: (Branch: rpm-5_4) rpm/rpmio msqio.c tmq.c Log: - msqio: handle EAGAIN return from mq_send() too. Summary: Revision Changes Path 1.1.2.22 +19 -7 rpm/rpmio/msqio.c 1.1.2.14 +1 -1 rpm/rpmio/tmq.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/rpmio/msqio.c ============================================================================ $ cvs diff -u -r1.1.2.21 -r1.1.2.22 msqio.c --- rpm/rpmio/msqio.c 29 May 2017 17:27:37 -0000 1.1.2.21 +++ rpm/rpmio/msqio.c 30 May 2017 08:17:40 -0000 1.1.2.22 @@ -817,7 +817,7 @@ return rc; } -static ssize_t rpmmsqReaderRead(rpmmsq msq, char *b, size_t nb, unsigned *priop) +static ssize_t rpmmsqReaderLoop(rpmmsq msq, int op, char *b, size_t nb, unsigned *priop) { ssize_t rc; @@ -825,7 +825,19 @@ do { struct timespec ts = { 0, 1000 }; - rc = mq_receive(msq->qid, b, nb, priop); + switch (op) { + case LIO_READ: + rc = mq_receive(msq->qid, b, nb, priop); + break; + case LIO_WRITE: + rc = mq_send(msq->qid, (const char *)b, nb, *priop); + break; + default: + rc = -1; + errno = EINVAL; /* XXX W2DO? */ + break; + } + /* Retry operation on timeouts and queue full. */ if (rc < 0) { switch (errno) { case ETIMEDOUT: /* XXX mq_timedreceive() */ @@ -868,22 +880,22 @@ /* Process the request. */ rpmaio aio = (rpmaio) item; + int op = aio->aiocb.aio_lio_opcode; char *b = (char *)aio->aiocb.aio_buf; size_t nb = aio->aiocb.aio_nbytes; + unsigned int prio = aio->aiocb.aio_reqprio; /* XXX prio */ rc = -1; - switch (aio->aiocb.aio_lio_opcode) { + switch (op) { case LIO_READ: - { unsigned int prio = 0; - rc = rpmmsqReaderRead(msq, b, nb, &prio); + { rc = rpmmsqReaderLoop(msq, op, b, nb, &prio); if (rc >= 0) { msq->nrecv++; aio->aiocb.aio_reqprio = prio; /* XXX prio */ } } break; case LIO_WRITE: - { unsigned int prio = aio->aiocb.aio_reqprio; /* XXX prio */ - rc = mq_send(msq->qid, (const char *)b, nb, prio); + { rc = rpmmsqReaderLoop(msq, op, b, nb, &prio); if (rc == 0) msq->nsent++; } break; @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/tmq.c ============================================================================ $ cvs diff -u -r1.1.2.13 -r1.1.2.14 tmq.c --- rpm/rpmio/tmq.c 29 May 2017 20:06:48 -0000 1.1.2.13 +++ rpm/rpmio/tmq.c 30 May 2017 08:17:41 -0000 1.1.2.14 @@ -726,7 +726,7 @@ if (qname == NULL) qname = xstrdup("rpm"); - switch (4) { + switch (2) { case 1: ec = doSHM(av, ac); break; case 2: ec = doMSQ(av, ac); break; case 3: ec = doTIMER(av, ac); break; @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org