diff --git a/components/lwp/lwp_pid.c b/components/lwp/lwp_pid.c index af32818162..f127c591c0 100644 --- a/components/lwp/lwp_pid.c +++ b/components/lwp/lwp_pid.c @@ -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; diff --git a/components/lwp/lwp_pid.h b/components/lwp/lwp_pid.h index 5e170f652d..ae9d712422 100644 --- a/components/lwp/lwp_pid.h +++ b/components/lwp/lwp_pid.h @@ -15,6 +15,8 @@ extern "C" { #endif +#include + #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);