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