4
0
mirror of https://github.com/RT-Thread/rt-thread.git synced 2025-02-21 01:07:18 +08:00

feat: support PID iteration

This change introduces the `lwp_pid_for_each` function, which provides a
convenient and thread-safe method for iterating over PIDs with a user-
defined callback. This addition is necessary to support cases where
operations must be performed on each PID in the balanced tree, enhancing
flexibility and modularity for PID management.

Changes:
- Added `lwp_pid_for_each` function in `lwp_pid.c` to allow iteration
  over PIDs using a callback function and optional data parameter.
- Defined a new internal `pid_foreach_param` structure to encapsulate
  the callback and data for the iteration.
- Added `_before_cb` helper function for executing the callback on each
  PID node during AVL traversal.
- Ensured thread safety by acquiring and releasing the PID lock around
  the AVL traversal within `lwp_pid_for_each`.
- Updated `lwp_pid.h` with the `lwp_pid_for_each` function prototype and
  included `rtthread.h` for necessary types.

Signed-off-by: Shell <smokewood@qq.com>
This commit is contained in:
Shell 2024-11-15 11:54:38 +08:00 committed by Rbb666
parent 2946e4a316
commit c0b0838892
2 changed files with 33 additions and 0 deletions

View File

@ -93,6 +93,35 @@ void lwp_pid_lock_release(void)
RT_ASSERT(0);
}
struct pid_foreach_param
{
int (*cb)(pid_t pid, void *data);
void *data;
};
static int _before_cb(struct lwp_avl_struct *node, void *data)
{
struct pid_foreach_param *param = data;
pid_t pid = node->avl_key;
return param->cb(pid, param->data);
}
int lwp_pid_for_each(int (*cb)(pid_t pid, void *data), void *data)
{
int error;
struct pid_foreach_param buf =
{
.cb = cb,
.data = data,
};
lwp_pid_lock_take();
error = lwp_avl_traversal(lwp_pid_root, _before_cb, &buf);
lwp_pid_lock_release();
return error;
}
struct lwp_avl_struct *lwp_get_pid_ary(void)
{
return lwp_pid_ary;

View File

@ -15,6 +15,8 @@
extern "C" {
#endif
#include <rtthread.h>
#define LWP_CREATE_FLAG_NONE 0x0000
#define LWP_CREATE_FLAG_ALLOC_PID 0x0001 /* allocate pid on lwp object create */
#define LWP_CREATE_FLAG_INIT_USPACE 0x0002 /* do user space initialization */
@ -24,6 +26,8 @@ struct rt_lwp;
struct lwp_avl_struct *lwp_get_pid_ary(void);
int lwp_pid_init(void);
int lwp_pid_for_each(int (*cb)(pid_t pid, void *data), void *data);
void lwp_pid_put(struct rt_lwp *lwp);
void lwp_pid_lock_take(void);
void lwp_pid_lock_release(void);