mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2025-10-23 10:41:50 +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:
@@ -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;
|
||||
|
Reference in New Issue
Block a user