1 /*
2 * Copyright (c) 2006-2020, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2020-02-23 Jesven first version.
9 */
10
11 #ifndef LWP_PID_H__
12 #define LWP_PID_H__
13
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17
18 #include <rtthread.h>
19
20 #define LWP_CREATE_FLAG_NONE 0x0000
21 #define LWP_CREATE_FLAG_ALLOC_PID 0x0001 /* allocate pid on lwp object create */
22 #define LWP_CREATE_FLAG_INIT_USPACE 0x0002 /* do user space initialization */
23 #define LWP_CREATE_FLAG_NOTRACE_EXEC 0x0004 /* not trace if execve() after fork() */
24
25 struct rt_lwp;
26
27 struct lwp_avl_struct *lwp_get_pid_ary(void);
28 int lwp_pid_init(void);
29 int lwp_pid_wait_for_empty(int wait_flags, rt_tick_t to);
30 int lwp_pid_for_each(int (*cb)(pid_t pid, void *data), void *data);
31 void lwp_pid_put(struct rt_lwp *lwp);
32 void lwp_pid_lock_take(void);
33 void lwp_pid_lock_release(void);
34
35 /**
36 * @brief Create a new lwp object
37 * This will initialize the member in the object and register to system.
38 * Besides, a new pid is allocate with lwp
39 *
40 * @param flags control the property of the lwp object. Can be ORed with:
41 * LWP_CREATE_FLAG_NONE: raw lwp object
42 * LWP_CREATE_FLAG_ALLOC_PID: lwp object with specified pid
43 *
44 * @return struct rt_lwp* object
45 */
46 struct rt_lwp* lwp_create(rt_base_t flags);
47
48 void lwp_free(struct rt_lwp* lwp);
49
50 int lwp_ref_inc(struct rt_lwp *lwp);
51 int lwp_ref_dec(struct rt_lwp *lwp);
52
53 struct rt_lwp* lwp_from_pid_raw_locked(pid_t pid);
54 struct rt_lwp* lwp_from_pid_locked(pid_t pid);
55 pid_t lwp_to_pid(struct rt_lwp* lwp);
56
57 pid_t lwp_name2pid(const char* name);
58 char* lwp_pid2name(int32_t pid);
59
60 int lwp_getpid(void);
61
62 struct rusage
63 {
64 struct timeval ru_utime;
65 struct timeval ru_stime;
66
67 long ru_maxrss;
68 long ru_ixrss;
69 long ru_idrss;
70 long ru_isrss;
71 long ru_minflt;
72 long ru_majflt;
73 long ru_nswap;
74 long ru_inblock;
75 long ru_oublock;
76 long ru_msgsnd;
77 long ru_msgrcv;
78 long ru_nsignals;
79 long ru_nvcsw;
80 long ru_nivcsw;
81 long reserved[16];
82 };
83 pid_t lwp_waitpid(const pid_t pid, int *status, int options, struct rusage *ru);
84 rt_err_t lwp_waitpid_kick(struct rt_lwp *parent, struct rt_lwp *self_lwp);
85 pid_t waitpid(pid_t pid, int *status, int options);
86 long list_process(void);
87
88 void lwp_user_object_lock_init(struct rt_lwp *lwp);
89 void lwp_user_object_lock_destroy(struct rt_lwp *lwp);
90 void lwp_user_object_lock(struct rt_lwp *lwp);
91 void lwp_user_object_unlock(struct rt_lwp *lwp);
92 int lwp_user_object_add(struct rt_lwp *lwp, rt_object_t object);
93 rt_err_t lwp_user_object_delete(struct rt_lwp *lwp, rt_object_t object);
94 void lwp_user_object_clear(struct rt_lwp *lwp);
95 void lwp_user_object_dup(struct rt_lwp *dst_lwp, struct rt_lwp *src_lwp);
96
lwp_from_pid_and_lock(pid_t pid)97 rt_inline struct rt_lwp *lwp_from_pid_and_lock(pid_t pid)
98 {
99 struct rt_lwp *lwp;
100 lwp_pid_lock_take();
101 lwp = lwp_from_pid_locked(pid);
102 if (lwp)
103 lwp_ref_inc(lwp);
104 lwp_pid_lock_release();
105
106 return lwp;
107 }
108
lwp_from_pid_release_lock(struct rt_lwp * lwp)109 rt_inline void lwp_from_pid_release_lock(struct rt_lwp *lwp)
110 {
111 if (lwp)
112 lwp_ref_dec(lwp);
113 }
114
115 typedef rt_base_t lwp_status_t;
116 void lwp_thread_exit(rt_thread_t thread, int status);
117 void lwp_exit(struct rt_lwp *lwp, lwp_status_t status);
118
119 #ifdef __cplusplus
120 }
121 #endif
122
123 #endif
124