lwp_pid.h 3.2 KB

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