xref: /minix3/minix/lib/libsockevent/sockevent_proc.c (revision 4c27a83389a10199451bd7e0199715b47b95045c)
1*4c27a833SDavid van Moolenbroek /* libsockevent - sockevent_proc.c - process suspension state management */
2*4c27a833SDavid van Moolenbroek 
3*4c27a833SDavid van Moolenbroek #include <minix/drivers.h>
4*4c27a833SDavid van Moolenbroek #include <minix/sockdriver.h>
5*4c27a833SDavid van Moolenbroek 
6*4c27a833SDavid van Moolenbroek #include "sockevent_proc.h"
7*4c27a833SDavid van Moolenbroek 
8*4c27a833SDavid van Moolenbroek static struct sockevent_proc sockevent_procs[NR_PROCS];
9*4c27a833SDavid van Moolenbroek static struct sockevent_proc *sockevent_freeprocs;
10*4c27a833SDavid van Moolenbroek 
11*4c27a833SDavid van Moolenbroek /*
12*4c27a833SDavid van Moolenbroek  * Initialize the process suspension table.
13*4c27a833SDavid van Moolenbroek  */
14*4c27a833SDavid van Moolenbroek void
sockevent_proc_init(void)15*4c27a833SDavid van Moolenbroek sockevent_proc_init(void)
16*4c27a833SDavid van Moolenbroek {
17*4c27a833SDavid van Moolenbroek 	unsigned int slot;
18*4c27a833SDavid van Moolenbroek 
19*4c27a833SDavid van Moolenbroek 	for (slot = 0; slot < __arraycount(sockevent_procs); slot++) {
20*4c27a833SDavid van Moolenbroek 		sockevent_procs[slot].spr_next = sockevent_freeprocs;
21*4c27a833SDavid van Moolenbroek 		sockevent_freeprocs = &sockevent_procs[slot];
22*4c27a833SDavid van Moolenbroek 	}
23*4c27a833SDavid van Moolenbroek }
24*4c27a833SDavid van Moolenbroek 
25*4c27a833SDavid van Moolenbroek /*
26*4c27a833SDavid van Moolenbroek  * Allocate and return a new socket process suspension entry.  Return NULL if
27*4c27a833SDavid van Moolenbroek  * no entries are available.
28*4c27a833SDavid van Moolenbroek  */
29*4c27a833SDavid van Moolenbroek struct sockevent_proc *
sockevent_proc_alloc(void)30*4c27a833SDavid van Moolenbroek sockevent_proc_alloc(void)
31*4c27a833SDavid van Moolenbroek {
32*4c27a833SDavid van Moolenbroek 	struct sockevent_proc *spr;
33*4c27a833SDavid van Moolenbroek 
34*4c27a833SDavid van Moolenbroek 	if ((spr = sockevent_freeprocs) == NULL)
35*4c27a833SDavid van Moolenbroek 		return NULL;
36*4c27a833SDavid van Moolenbroek 
37*4c27a833SDavid van Moolenbroek 	sockevent_freeprocs = spr->spr_next;
38*4c27a833SDavid van Moolenbroek 	spr->spr_next = NULL;
39*4c27a833SDavid van Moolenbroek 
40*4c27a833SDavid van Moolenbroek 	return spr;
41*4c27a833SDavid van Moolenbroek }
42*4c27a833SDavid van Moolenbroek 
43*4c27a833SDavid van Moolenbroek /*
44*4c27a833SDavid van Moolenbroek  * Free up a previously allocated socket process suspension entry for reuse.
45*4c27a833SDavid van Moolenbroek  */
46*4c27a833SDavid van Moolenbroek void
sockevent_proc_free(struct sockevent_proc * spr)47*4c27a833SDavid van Moolenbroek sockevent_proc_free(struct sockevent_proc * spr)
48*4c27a833SDavid van Moolenbroek {
49*4c27a833SDavid van Moolenbroek 
50*4c27a833SDavid van Moolenbroek 	spr->spr_next = sockevent_freeprocs;
51*4c27a833SDavid van Moolenbroek 	sockevent_freeprocs = spr;
52*4c27a833SDavid van Moolenbroek }
53