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

Reply via email to