shm_mq: Repair breakage from previous commit.
authorRobert Haas <[email protected]>
Fri, 23 Oct 2015 02:01:11 +0000 (22:01 -0400)
committerRobert Haas <[email protected]>
Fri, 23 Oct 2015 02:01:11 +0000 (22:01 -0400)
If the counterparty writes some data into the queue and then detaches,
it's wrong to return SHM_MQ_DETACHED right away.  If we do that, we
fail to read whatever was written.

src/backend/storage/ipc/shm_mq.c

index 61f9298489d66272854f465324eabdeb3b4e3b96..1d0657f3858792bb472a67d9de70838904d17c9a 100644 (file)
@@ -501,10 +501,12 @@ shm_mq_receive(shm_mq_handle *mqh, Size *nbytesp, void **datap, bool nowait)
    {
        if (nowait)
        {
-           if (shm_mq_counterparty_gone(mq, mqh->mqh_handle))
-               return SHM_MQ_DETACHED;
            if (shm_mq_get_sender(mq) == NULL)
+           {
+               if (shm_mq_counterparty_gone(mq, mqh->mqh_handle))
+                   return SHM_MQ_DETACHED;
                return SHM_MQ_WOULD_BLOCK;
+           }
        }
        else if (!shm_mq_wait_internal(mq, &mq->mq_sender, mqh->mqh_handle)
                 && shm_mq_get_sender(mq) == NULL)