mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2025-10-20 05:25:04 +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);
|
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)
|
struct lwp_avl_struct *lwp_get_pid_ary(void)
|
||||||
{
|
{
|
||||||
return lwp_pid_ary;
|
return lwp_pid_ary;
|
||||||
|
@@ -15,6 +15,8 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <rtthread.h>
|
||||||
|
|
||||||
#define LWP_CREATE_FLAG_NONE 0x0000
|
#define LWP_CREATE_FLAG_NONE 0x0000
|
||||||
#define LWP_CREATE_FLAG_ALLOC_PID 0x0001 /* allocate pid on lwp object create */
|
#define LWP_CREATE_FLAG_ALLOC_PID 0x0001 /* allocate pid on lwp object create */
|
||||||
#define LWP_CREATE_FLAG_INIT_USPACE 0x0002 /* do user space initialization */
|
#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);
|
struct lwp_avl_struct *lwp_get_pid_ary(void);
|
||||||
int lwp_pid_init(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_put(struct rt_lwp *lwp);
|
||||||
void lwp_pid_lock_take(void);
|
void lwp_pid_lock_take(void);
|
||||||
void lwp_pid_lock_release(void);
|
void lwp_pid_lock_release(void);
|
||||||
|
Reference in New Issue
Block a user