ohmu
·
2026-10-15
1#include "processes.h"
2
3#include <hurd.h>
4#include <ps.h>
5
6const char* ffDetectProcesses(const FFProcessesOptions* options, FFProcessesResult* result) {
7 struct ps_context* context = nullptr;
8 if (ps_context_create(getproc(), &context) != 0) {
9 return "ps_context_create(getproc()) failed";
10 }
11
12 const char* error = nullptr;
13 struct proc_stat_list* list = nullptr;
14 if (proc_stat_list_create(context, &list) != 0) {
15 error = "proc_stat_list_create() failed";
16 goto done;
17 }
18
19 if (proc_stat_list_add_all(list, nullptr, nullptr) != 0) {
20 error = "proc_stat_list_add_all() failed";
21 goto done;
22 }
23
24 proc_stat_list_set_flags(list, PSTAT_NUM_THREADS);
25
26 for (uint32_t i = 0; i < list->num_procs; i++) {
27 struct proc_stat* stat = list->proc_stats[i];
28 if (!options->countKprocs && proc_stat_pid(stat) == 2) { // Kernel Task
29 continue;
30 }
31
32 ++result->processes;
33 if (proc_stat_has(stat, PSTAT_NUM_THREADS)) {
34 result->threads += proc_stat_num_threads(stat);
35 }
36 }
37
38done:
39 if (list) {
40 proc_stat_list_free(list);
41 }
42 ps_context_free(context);
43 return error;
44}