summaryrefslogtreecommitdiff
path: root/components/drivers/src
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2019-04-01 18:10:44 +0800
committerGitHub <[email protected]>2019-04-01 18:10:44 +0800
commit2c8fb7022ebfbfcbe4da1560f276636aa43a91ba (patch)
treed35735bb11b6354ee13a7202992acb73bf6574bf /components/drivers/src
parent98ff2c00ceff735eff608a28f7811b7455c49a48 (diff)
parentff0037872874fe6be1a5a3609938f956ac9acd6f (diff)
Merge pull request #2526 from BernardXiong/fix_pipe
[libc] Fix the unamed pipe close issue
Diffstat (limited to 'components/drivers/src')
-rw-r--r--components/drivers/src/pipe.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/components/drivers/src/pipe.c b/components/drivers/src/pipe.c
index 065fd21dc1..16fb82dbfb 100644
--- a/components/drivers/src/pipe.c
+++ b/components/drivers/src/pipe.c
@@ -97,6 +97,12 @@ static int pipe_fops_close(struct dfs_fd *fd)
rt_mutex_release(&(pipe->lock));
+ if (device->ref_count == 0 && pipe->is_named == RT_FALSE)
+ {
+ /* delete the unamed pipe */
+ rt_pipe_delete(device->parent.name);
+ }
+
return 0;
}
@@ -423,6 +429,7 @@ rt_pipe_t *rt_pipe_create(const char *name, int bufsz)
if (pipe == RT_NULL) return RT_NULL;
rt_memset(pipe, 0, sizeof(rt_pipe_t));
+ pipe->is_named = RT_TRUE; /* initialize as a named pipe */
rt_mutex_init(&(pipe->lock), name, RT_IPC_FLAG_FIFO);
rt_wqueue_init(&(pipe->reader_queue));
rt_wqueue_init(&(pipe->writer_queue));
@@ -517,6 +524,7 @@ int pipe(int fildes[2])
return -1;
}
+ pipe->is_named = RT_FALSE; /* unamed pipe */
rt_snprintf(dev_name, sizeof(dev_name), "/dev/%s", dname);
fildes[0] = open(dev_name, O_RDONLY, 0);
if (fildes[0] < 0)