tmedicci commented on code in PR #8985:
URL: https://github.com/apache/nuttx/pull/8985#discussion_r1164012011


##########
drivers/pipes/pipe_common.c:
##########
@@ -171,56 +173,109 @@ int pipecommon_open(FAR struct file *filep)
     {
       dev->d_nwriters++;
 
-      /* If this is the first writer, then the read semaphore indicates the
-       * number of readers waiting for the first writer.  Wake them all up.
+      /* If this is the first writer, then the n-writers semaphore
+       * indicates the number of readers waiting for the first writer.
+       * Wake them all up!
        */
 
       if (dev->d_nwriters == 1)
         {
-          while (nxsem_get_value(&dev->d_rdsem, &sval) == 0 && sval <= 0)
+          while (nxsem_get_value(&dev->d_nwrsem, &sval) == OK && sval <= 0)
             {
-              nxsem_post(&dev->d_rdsem);
+              nxsem_post(&dev->d_nwrsem);
             }
         }
     }
 
+  while ((filep->f_oflags & O_NONBLOCK) == 0 &&     /* Blocking */
+         (filep->f_oflags & O_RDWR) == O_WRONLY &&  /* Write-only */
+         dev->d_nreaders < 1 &&                     /* No readers on the pipe 
*/
+         dev->d_wrndx == dev->d_rdndx)              /* Buffer is empty */
+    {
+      /* If opened for write-only, then wait for at least one reader
+       * on the pipe.
+       */
+
+      nxmutex_unlock(&dev->d_bflock);
+
+      ret = nxsem_wait(&dev->d_nrdsem);
+      if (ret < 0)
+        {
+          ferr("ERROR: nxsem_wait failed: %d\n", ret);
+
+          /* Immediately close the pipe that we just opened */
+
+          pipecommon_close(filep);
+          return ret;
+        }
+
+      /* The nxmutex_lock() call should fail if we are awakened by a
+       * signal or if the task is canceled.
+       */
+
+      ret = nxmutex_lock(&dev->d_bflock);
+      if (ret < 0)
+        {
+          ferr("ERROR: nxmutex_lock failed: %d\n", ret);
+
+          /* Immediately close the pipe that we just opened */
+
+          pipecommon_close(filep);
+          return ret;
+        }
+    }
+
   /* If opened for reading, increment the count of reader on on the pipe
    * instance.
    */
 
   if ((filep->f_oflags & O_RDOK) != 0)
     {
       dev->d_nreaders++;
+
+      /* If this is the first reader, then the n-readers semaphore
+       * indicates the number of writers waiting for the first reader.
+       * Wake them all up.
+       */
+
+      if (dev->d_nreaders == 1)
+        {
+          while (nxsem_get_value(&dev->d_nrdsem, &sval) == OK && sval <= 0)
+            {
+              nxsem_post(&dev->d_nrdsem);
+            }
+        }
     }
 
-  while ((filep->f_oflags & O_NONBLOCK) == 0 &&    /* Non-blocking */
-         (filep->f_oflags & O_RDWR) == O_RDONLY && /* Read-only */
-         dev->d_nwriters < 1 &&                    /* No writers on the pipe */
-         dev->d_wrndx == dev->d_rdndx)             /* Buffer is empty */
+  while ((filep->f_oflags & O_NONBLOCK) == 0 &&     /* Blocking */
+         (filep->f_oflags & O_RDWR) == O_RDONLY &&  /* Read-only */

Review Comment:
   Please check the above comment 
(https://github.com/apache/nuttx/pull/8985#discussion_r1164010390)



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to