diff --git a/drivers/pipes/pipe_common.c b/drivers/pipes/pipe_common.c index 28f218b8688..47d8fa6accc 100644 --- a/drivers/pipes/pipe_common.c +++ b/drivers/pipes/pipe_common.c @@ -346,6 +346,10 @@ int pipecommon_close(FAR struct file *filep) /* Inform poll writers that other end closed. */ pipecommon_pollnotify(dev, POLLERR); + while (nxsem_get_value(&dev->d_wrsem, &sval) == 0 && sval < 0) + { + nxsem_post(&dev->d_wrsem); + } } } } @@ -654,6 +658,11 @@ ssize_t pipecommon_write(FAR struct file *filep, FAR const char *buffer, ret = nxsem_wait(&dev->d_wrsem); sched_unlock(); + if (dev->d_nreaders <= 0) + { + ret = -EPIPE; + } + if (ret < 0 || (ret = nxsem_wait(&dev->d_bfsem)) < 0) { /* Either call nxsem_wait may fail because a signal was