proc.odin 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package darwin
  2. import "base:intrinsics"
  3. import "core:sys/posix"
  4. foreign import lib "system:System.framework"
  5. // Incomplete bindings to the proc API on MacOS, add to when needed.
  6. foreign lib {
  7. proc_pidinfo :: proc(pid: posix.pid_t, flavor: PID_Info_Flavor, arg: i64, buffer: rawptr, buffersize: i32) -> i32 ---
  8. proc_pidpath :: proc(pid: posix.pid_t, buffer: [^]byte, buffersize: u32) -> i32 ---
  9. proc_listallpids :: proc(buffer: [^]i32, buffersize: i32) -> i32 ---
  10. proc_pid_rusage :: proc(pid: posix.pid_t, flavor: Pid_Rusage_Flavor, buffer: rawptr) -> i32 ---
  11. }
  12. MAXCOMLEN :: 16
  13. proc_bsdinfo :: struct {
  14. pbi_flags: PBI_Flags,
  15. pbi_status: u32,
  16. pbi_xstatus: u32,
  17. pbi_pid: u32,
  18. pbi_ppid: u32,
  19. pbi_uid: posix.uid_t,
  20. pbi_gid: posix.gid_t,
  21. pbi_ruid: posix.uid_t,
  22. pbi_rgid: posix.gid_t,
  23. pbi_svuid: posix.uid_t,
  24. pbi_svgid: posix.gid_t,
  25. rfu_1: u32,
  26. pbi_comm: [MAXCOMLEN]byte `fmt:"s,0"`,
  27. pbi_name: [2 * MAXCOMLEN]byte `fmt:"s,0"`,
  28. pbi_nfiles: u32,
  29. pbi_pgid: u32,
  30. pbi_pjobc: u32,
  31. e_tdev: u32,
  32. e_tpgid: u32,
  33. pbi_nice: i32,
  34. pbi_start_tvsec: u64,
  35. pbi_start_tvusec: u64,
  36. }
  37. proc_bsdshortinfo :: struct {
  38. pbsi_pid: u32,
  39. pbsi_ppid: u32,
  40. pbsi_pgid: u32,
  41. pbsi_status: u32,
  42. pbsi_comm: [MAXCOMLEN]byte `fmt:"s,0"`,
  43. pbsi_flags: PBI_Flags,
  44. pbsi_uid: posix.uid_t,
  45. pbsi_gid: posix.gid_t,
  46. pbsi_ruid: posix.uid_t,
  47. pbsi_rgid: posix.gid_t,
  48. pbsi_svuid: posix.uid_t,
  49. pbsi_svgid: posix.gid_t,
  50. pbsi_rfu: u32,
  51. }
  52. proc_vnodepathinfo :: struct {
  53. pvi_cdir: vnode_info_path,
  54. pvi_rdir: vnode_info_path,
  55. }
  56. vnode_info_path :: struct {
  57. vip_vi: vnode_info,
  58. vip_path: [posix.PATH_MAX]byte,
  59. }
  60. vnode_info :: struct {
  61. vi_stat: vinfo_stat,
  62. vi_type: i32,
  63. vi_pad: i32,
  64. vi_fsid: fsid_t,
  65. }
  66. vinfo_stat :: struct {
  67. vst_dev: u32,
  68. vst_mode: u16,
  69. vst_nlink: u16,
  70. vst_ino: u64,
  71. vst_uid: posix.uid_t,
  72. vst_gid: posix.gid_t,
  73. vst_atime: i64,
  74. vst_atimensec: i64,
  75. vst_mtime: i64,
  76. vst_mtimensec: i64,
  77. vst_ctime: i64,
  78. vst_ctimensec: i64,
  79. vst_birthtime: i64,
  80. vst_birthtimensec: i64,
  81. vst_size: posix.off_t,
  82. vst_blocks: i64,
  83. vst_blksize: i32,
  84. vst_flags: u32,
  85. vst_gen: u32,
  86. vst_rdev: u32,
  87. vst_qspare: [2]i64,
  88. }
  89. proc_taskinfo :: struct {
  90. pti_virtual_size: u64 `fmt:"M"`,
  91. pti_resident_size: u64 `fmt:"M"`,
  92. pti_total_user: u64,
  93. pti_total_system: u64,
  94. pti_threads_user: u64,
  95. pti_threads_system: u64,
  96. pti_policy: i32,
  97. pti_faults: i32,
  98. pti_pageins: i32,
  99. pti_cow_faults: i32,
  100. pti_messages_sent: i32,
  101. pti_messages_received: i32,
  102. pti_syscalls_mach: i32,
  103. pti_syscalls_unix: i32,
  104. pti_csw: i32,
  105. pti_threadnum: i32,
  106. pti_numrunning: i32,
  107. pti_priority: i32,
  108. }
  109. proc_taskallinfo :: struct {
  110. pbsd: proc_bsdinfo,
  111. ptinfo: proc_taskinfo,
  112. }
  113. fsid_t :: distinct [2]i32
  114. PBI_Flag_Bits :: enum u32 {
  115. SYSTEM = intrinsics.constant_log2(0x0001),
  116. TRACED = intrinsics.constant_log2(0x0002),
  117. INEXIT = intrinsics.constant_log2(0x0004),
  118. PWAIT = intrinsics.constant_log2(0x0008),
  119. LP64 = intrinsics.constant_log2(0x0010),
  120. SLEADER = intrinsics.constant_log2(0x0020),
  121. CTTY = intrinsics.constant_log2(0x0040),
  122. CONTROLT = intrinsics.constant_log2(0x0080),
  123. THCWD = intrinsics.constant_log2(0x0100),
  124. PC_THROTTLE = intrinsics.constant_log2(0x0200),
  125. PC_SUSP = intrinsics.constant_log2(0x0400),
  126. PC_KILL = intrinsics.constant_log2(0x0600),
  127. PA_THROTTLE = intrinsics.constant_log2(0x0800),
  128. PA_SUSP = intrinsics.constant_log2(0x1000),
  129. PA_PSUGID = intrinsics.constant_log2(0x2000),
  130. EXEC = intrinsics.constant_log2(0x4000),
  131. }
  132. PBI_Flags :: bit_set[PBI_Flag_Bits; u32]
  133. PID_Info_Flavor :: enum i32 {
  134. LISTFDS = 1,
  135. TASKALLINFO,
  136. BSDINFO,
  137. TASKINFO,
  138. THREADINFO,
  139. LISTTHREADS,
  140. REGIONINFO,
  141. REGIONPATHINFO,
  142. VNODEPATHINFO,
  143. THREADPATHINFO,
  144. PATHINFO,
  145. WORKQUEUEINFO,
  146. SHORTBSDINFO,
  147. LISTFILEPORTS,
  148. THREADID64INFO,
  149. RUSAGE,
  150. }
  151. PIDPATHINFO_MAXSIZE :: 4*posix.PATH_MAX
  152. Pid_Rusage_Flavor :: enum i32 {
  153. V0,
  154. V1,
  155. V2,
  156. V3,
  157. V4,
  158. V5,
  159. }
  160. rusage_info_v0 :: struct {
  161. ri_uuid: [16]u8,
  162. ri_user_time: u64,
  163. ri_system_time: u64,
  164. ri_pkg_idle_wkups: u64,
  165. ri_interrupt_wkups: u64,
  166. ri_pageins: u64,
  167. ri_wired_size: u64,
  168. ri_resident_size: u64,
  169. ri_phys_footprint: u64,
  170. ri_proc_start_abstime: u64,
  171. ri_proc_exit_abstime: u64,
  172. }