diff options
| author | Bernard Xiong <[email protected]> | 2019-03-31 15:21:49 +0800 |
|---|---|---|
| committer | Bernard Xiong <[email protected]> | 2019-03-31 15:21:49 +0800 |
| commit | ff0037872874fe6be1a5a3609938f956ac9acd6f (patch) | |
| tree | 52ae0ab1a1dcc425bbaaabdb4b25743e14424c08 /components/drivers | |
| parent | c9bcfcc63c52eab5974c90012c38fe794a1c78e6 (diff) | |
[libc] Fix the unamed pipe close issue
Diffstat (limited to 'components/drivers')
| -rw-r--r-- | components/drivers/include/ipc/pipe.h | 1 | ||||
| -rw-r--r-- | components/drivers/src/pipe.c | 8 |
2 files changed, 9 insertions, 0 deletions
diff --git a/components/drivers/include/ipc/pipe.h b/components/drivers/include/ipc/pipe.h index 25b19f540d..93ba95cd2c 100644 --- a/components/drivers/include/ipc/pipe.h +++ b/components/drivers/include/ipc/pipe.h @@ -24,6 +24,7 @@ struct rt_pipe_device { struct rt_device parent; + rt_bool_t is_named; /* ring buffer in pipe device */ struct rt_ringbuffer *fifo; 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) |
