Pārlūkot izejas kodu

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>
Shell 5 mēneši atpakaļ
vecāks
revīzija
c0b0838892
2 mainītis faili ar 33 papildinājumiem un 0 dzēšanām
  1. 29 0
      components/lwp/lwp_pid.c
  2. 4 0
      components/lwp/lwp_pid.h

+ 29 - 0
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;

+ 4 - 0
components/lwp/lwp_pid.h

@@ -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);