xref: /minix3/minix/usr.bin/trace/proc.c (revision 521fa314e2aaec3c192c15f2aaa4c677a544e62a)
1*521fa314SDavid van Moolenbroek 
2*521fa314SDavid van Moolenbroek #include "inc.h"
3*521fa314SDavid van Moolenbroek 
4*521fa314SDavid van Moolenbroek static TAILQ_HEAD(, trace_proc) proc_root;
5*521fa314SDavid van Moolenbroek static unsigned int nr_procs;
6*521fa314SDavid van Moolenbroek 
7*521fa314SDavid van Moolenbroek /*
8*521fa314SDavid van Moolenbroek  * Initialize the list of traced processes.
9*521fa314SDavid van Moolenbroek  */
10*521fa314SDavid van Moolenbroek void
proc_init(void)11*521fa314SDavid van Moolenbroek proc_init(void)
12*521fa314SDavid van Moolenbroek {
13*521fa314SDavid van Moolenbroek 
14*521fa314SDavid van Moolenbroek 	TAILQ_INIT(&proc_root);
15*521fa314SDavid van Moolenbroek 	nr_procs = 0;
16*521fa314SDavid van Moolenbroek }
17*521fa314SDavid van Moolenbroek 
18*521fa314SDavid van Moolenbroek /*
19*521fa314SDavid van Moolenbroek  * Add a new process to the list of traced processes, allocating memory for it
20*521fa314SDavid van Moolenbroek  * first.  Return the new process structure with its PID assigned and the rest
21*521fa314SDavid van Moolenbroek  * zeroed out, or NULL upon allocation failure (with errno set appropriately).
22*521fa314SDavid van Moolenbroek  */
23*521fa314SDavid van Moolenbroek struct trace_proc *
proc_add(pid_t pid)24*521fa314SDavid van Moolenbroek proc_add(pid_t pid)
25*521fa314SDavid van Moolenbroek {
26*521fa314SDavid van Moolenbroek 	struct trace_proc *proc;
27*521fa314SDavid van Moolenbroek 
28*521fa314SDavid van Moolenbroek 	proc = (struct trace_proc *)malloc(sizeof(struct trace_proc));
29*521fa314SDavid van Moolenbroek 
30*521fa314SDavid van Moolenbroek 	if (proc == NULL)
31*521fa314SDavid van Moolenbroek 		return NULL;
32*521fa314SDavid van Moolenbroek 
33*521fa314SDavid van Moolenbroek 	memset(proc, 0, sizeof(*proc));
34*521fa314SDavid van Moolenbroek 
35*521fa314SDavid van Moolenbroek 	proc->pid = pid;
36*521fa314SDavid van Moolenbroek 
37*521fa314SDavid van Moolenbroek 	TAILQ_INSERT_TAIL(&proc_root, proc, next);
38*521fa314SDavid van Moolenbroek 	nr_procs++;
39*521fa314SDavid van Moolenbroek 
40*521fa314SDavid van Moolenbroek 	return proc;
41*521fa314SDavid van Moolenbroek }
42*521fa314SDavid van Moolenbroek 
43*521fa314SDavid van Moolenbroek /*
44*521fa314SDavid van Moolenbroek  * Retrieve the data structure for a traced process based on its PID.  Return
45*521fa314SDavid van Moolenbroek  * a pointer to the structure, or NULL if no structure exists for this process.
46*521fa314SDavid van Moolenbroek  */
47*521fa314SDavid van Moolenbroek struct trace_proc *
proc_get(pid_t pid)48*521fa314SDavid van Moolenbroek proc_get(pid_t pid)
49*521fa314SDavid van Moolenbroek {
50*521fa314SDavid van Moolenbroek 	struct trace_proc *proc;
51*521fa314SDavid van Moolenbroek 
52*521fa314SDavid van Moolenbroek 	/* Linear search for now; se we can easily add a hashtable later.. */
53*521fa314SDavid van Moolenbroek 	TAILQ_FOREACH(proc, &proc_root, next) {
54*521fa314SDavid van Moolenbroek 		if (proc->pid == pid)
55*521fa314SDavid van Moolenbroek 			return proc;
56*521fa314SDavid van Moolenbroek 	}
57*521fa314SDavid van Moolenbroek 
58*521fa314SDavid van Moolenbroek 	return NULL;
59*521fa314SDavid van Moolenbroek }
60*521fa314SDavid van Moolenbroek 
61*521fa314SDavid van Moolenbroek /*
62*521fa314SDavid van Moolenbroek  * Remove a process from the list of traced processes.
63*521fa314SDavid van Moolenbroek  */
64*521fa314SDavid van Moolenbroek void
proc_del(struct trace_proc * proc)65*521fa314SDavid van Moolenbroek proc_del(struct trace_proc * proc)
66*521fa314SDavid van Moolenbroek {
67*521fa314SDavid van Moolenbroek 
68*521fa314SDavid van Moolenbroek 	TAILQ_REMOVE(&proc_root, proc, next);
69*521fa314SDavid van Moolenbroek 	nr_procs--;
70*521fa314SDavid van Moolenbroek 
71*521fa314SDavid van Moolenbroek 	free(proc);
72*521fa314SDavid van Moolenbroek }
73*521fa314SDavid van Moolenbroek 
74*521fa314SDavid van Moolenbroek /*
75*521fa314SDavid van Moolenbroek  * Iterator for the list of traced processes.  If a NULL pointer is given,
76*521fa314SDavid van Moolenbroek  * return the first process in the list; otherwise, return the next process in
77*521fa314SDavid van Moolenbroek  * the list.  Not stable with respect to list modifications.
78*521fa314SDavid van Moolenbroek  */
79*521fa314SDavid van Moolenbroek struct trace_proc *
proc_next(struct trace_proc * proc)80*521fa314SDavid van Moolenbroek proc_next(struct trace_proc * proc)
81*521fa314SDavid van Moolenbroek {
82*521fa314SDavid van Moolenbroek 
83*521fa314SDavid van Moolenbroek 	if (proc == NULL)
84*521fa314SDavid van Moolenbroek 		return TAILQ_FIRST(&proc_root);
85*521fa314SDavid van Moolenbroek 	else
86*521fa314SDavid van Moolenbroek 		return TAILQ_NEXT(proc, next);
87*521fa314SDavid van Moolenbroek }
88*521fa314SDavid van Moolenbroek 
89*521fa314SDavid van Moolenbroek /*
90*521fa314SDavid van Moolenbroek  * Return the number of processes in the list of traced processes.
91*521fa314SDavid van Moolenbroek  */
92*521fa314SDavid van Moolenbroek unsigned int
proc_count(void)93*521fa314SDavid van Moolenbroek proc_count(void)
94*521fa314SDavid van Moolenbroek {
95*521fa314SDavid van Moolenbroek 
96*521fa314SDavid van Moolenbroek 	return nr_procs;
97*521fa314SDavid van Moolenbroek }
98