summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShell <[email protected]>2023-06-29 00:00:27 +0800
committerGitHub <[email protected]>2023-06-29 00:00:27 +0800
commit0b79bea7cde71dc8db1d8ba33acd2705de64ee76 (patch)
tree3e7f1c8e97d15ba6f87eeba9151139a4c0519ae7
parenteafc77318683f5806c3b07f5e18dbcfa43073e2a (diff)
[components/lwp] clear ref to parent on waitpid() (#7741)
Signed-off-by: shell <[email protected]>
-rw-r--r--components/drivers/ipc/pipe.c10
-rw-r--r--components/lwp/lwp_pid.c7
2 files changed, 12 insertions, 5 deletions
diff --git a/components/drivers/ipc/pipe.c b/components/drivers/ipc/pipe.c
index bfed214678..d1e8665963 100644
--- a/components/drivers/ipc/pipe.c
+++ b/components/drivers/ipc/pipe.c
@@ -7,6 +7,8 @@
* Date Author Notes
* 2012-09-30 Bernard first version.
* 2017-11-08 JasonJiaJie fix memory leak issue when close a pipe.
+ * 2023-06-28 shell return POLLHUP when writer closed its channel on poll()
+ * fix flag test on pipe_fops_open()
*/
#include <rthw.h>
#include <rtdevice.h>
@@ -65,12 +67,12 @@ static int pipe_fops_open(struct dfs_file *fd)
rt_mutex_take(&pipe->lock, RT_WAITING_FOREVER);
- if ((fd->flags & O_RDONLY) == O_RDONLY)
+ if ((fd->flags & O_ACCMODE) == O_RDONLY)
{
pipe->reader = 1;
}
- if ((fd->flags & O_WRONLY) == O_WRONLY)
+ if ((fd->flags & O_ACCMODE) == O_WRONLY)
{
pipe->writer = 1;
}
@@ -362,6 +364,10 @@ static int pipe_fops_poll(struct dfs_file *fd, rt_pollreq_t *req)
{
mask |= POLLIN;
}
+ else if (pipe->writer == 0)
+ {
+ mask = POLLHUP;
+ }
}
if (mode & 2)
diff --git a/components/lwp/lwp_pid.c b/components/lwp/lwp_pid.c
index d015c76cab..d9710ad356 100644
--- a/components/lwp/lwp_pid.c
+++ b/components/lwp/lwp_pid.c
@@ -7,6 +7,8 @@
* Date Author Notes
* 2019-10-16 zhangjun first version
* 2021-02-20 lizhirui fix warning
+ * 2023-06-26 shell clear ref to parent on waitpid()
+ * Remove recycling of lwp on waitpid() and leave it to defunct routine
*/
#include <rthw.h>
@@ -672,6 +674,7 @@ pid_t waitpid(pid_t pid, int *status, int options)
if (ret != -1)
{
+ /* delete from sibling list of its parent */
struct rt_lwp **lwp_node;
*status = lwp->lwp_ret;
@@ -682,9 +685,7 @@ pid_t waitpid(pid_t pid, int *status, int options)
lwp_node = &(*lwp_node)->sibling;
}
(*lwp_node) = lwp->sibling;
-
- lwp_pid_put(pid);
- rt_free(lwp);
+ lwp->parent = RT_NULL;
}
quit: