xref: /minix3/minix/fs/ptyfs/node.c (revision da21d850255e4f11bb2023f69a0b3aad4eab62e2)
1*da21d850SDavid van Moolenbroek /* PTYFS slave node management */
2*da21d850SDavid van Moolenbroek /*
3*da21d850SDavid van Moolenbroek  * While the interface of this module should be flexible enough to implement
4*da21d850SDavid van Moolenbroek  * various memory management approaches, the current code simply relies on
5*da21d850SDavid van Moolenbroek  * NR_PTYS being small enough to preallocate all data structures.  In the
6*da21d850SDavid van Moolenbroek  * future, NR_PTYS will no longer be a system-global definition, and future
7*da21d850SDavid van Moolenbroek  * implementations of this module should not rely on NR_PTYS at all.
8*da21d850SDavid van Moolenbroek  */
9*da21d850SDavid van Moolenbroek 
10*da21d850SDavid van Moolenbroek #include <minix/drivers.h>
11*da21d850SDavid van Moolenbroek 
12*da21d850SDavid van Moolenbroek #include "node.h"
13*da21d850SDavid van Moolenbroek 
14*da21d850SDavid van Moolenbroek static bitchunk_t node_map[BITMAP_CHUNKS(NR_PTYS)];
15*da21d850SDavid van Moolenbroek static struct node_data node_data[NR_PTYS];
16*da21d850SDavid van Moolenbroek 
17*da21d850SDavid van Moolenbroek /*
18*da21d850SDavid van Moolenbroek  * Initialize the node module.
19*da21d850SDavid van Moolenbroek  */
20*da21d850SDavid van Moolenbroek void
init_nodes(void)21*da21d850SDavid van Moolenbroek init_nodes(void)
22*da21d850SDavid van Moolenbroek {
23*da21d850SDavid van Moolenbroek 
24*da21d850SDavid van Moolenbroek 	memset(&node_map, 0, sizeof(node_map));
25*da21d850SDavid van Moolenbroek }
26*da21d850SDavid van Moolenbroek 
27*da21d850SDavid van Moolenbroek /*
28*da21d850SDavid van Moolenbroek  * Allocate a node with a given node index number, and save node data for it.
29*da21d850SDavid van Moolenbroek  * It is possible that the node is in use already; in that case, only update
30*da21d850SDavid van Moolenbroek  * its associated data.  Return OK on success, or an error code on failure.
31*da21d850SDavid van Moolenbroek  */
32*da21d850SDavid van Moolenbroek int
set_node(node_t index,struct node_data * data)33*da21d850SDavid van Moolenbroek set_node(node_t index, struct node_data * data)
34*da21d850SDavid van Moolenbroek {
35*da21d850SDavid van Moolenbroek 
36*da21d850SDavid van Moolenbroek 	if (index >= NR_PTYS)
37*da21d850SDavid van Moolenbroek 		return ENOMEM;
38*da21d850SDavid van Moolenbroek 
39*da21d850SDavid van Moolenbroek 	SET_BIT(node_map, index);
40*da21d850SDavid van Moolenbroek 
41*da21d850SDavid van Moolenbroek 	node_data[index] = *data;
42*da21d850SDavid van Moolenbroek 
43*da21d850SDavid van Moolenbroek 	return OK;
44*da21d850SDavid van Moolenbroek }
45*da21d850SDavid van Moolenbroek 
46*da21d850SDavid van Moolenbroek /*
47*da21d850SDavid van Moolenbroek  * Deallocate a node using its node index number.  This function always
48*da21d850SDavid van Moolenbroek  * succeeds, intentionally ignoring the case that the node was not allocated.
49*da21d850SDavid van Moolenbroek  */
50*da21d850SDavid van Moolenbroek void
clear_node(node_t index)51*da21d850SDavid van Moolenbroek clear_node(node_t index)
52*da21d850SDavid van Moolenbroek {
53*da21d850SDavid van Moolenbroek 
54*da21d850SDavid van Moolenbroek 	UNSET_BIT(node_map, index);
55*da21d850SDavid van Moolenbroek }
56*da21d850SDavid van Moolenbroek 
57*da21d850SDavid van Moolenbroek /*
58*da21d850SDavid van Moolenbroek  * Return a pointer to the node data associated with the given node index
59*da21d850SDavid van Moolenbroek  * number.  If the node is not allocated, return NULL.
60*da21d850SDavid van Moolenbroek  */
61*da21d850SDavid van Moolenbroek struct node_data *
get_node(node_t index)62*da21d850SDavid van Moolenbroek get_node(node_t index)
63*da21d850SDavid van Moolenbroek {
64*da21d850SDavid van Moolenbroek 
65*da21d850SDavid van Moolenbroek 	if (index >= NR_PTYS || !GET_BIT(node_map, index))
66*da21d850SDavid van Moolenbroek 		return NULL;
67*da21d850SDavid van Moolenbroek 
68*da21d850SDavid van Moolenbroek 	return &node_data[index];
69*da21d850SDavid van Moolenbroek }
70*da21d850SDavid van Moolenbroek 
71*da21d850SDavid van Moolenbroek /*
72*da21d850SDavid van Moolenbroek  * Return the highest allocated node index number, plus one.  This value is
73*da21d850SDavid van Moolenbroek  * used to check given node indices and limit linear iterations.
74*da21d850SDavid van Moolenbroek  */
75*da21d850SDavid van Moolenbroek node_t
get_max_node(void)76*da21d850SDavid van Moolenbroek get_max_node(void)
77*da21d850SDavid van Moolenbroek {
78*da21d850SDavid van Moolenbroek 
79*da21d850SDavid van Moolenbroek 	/*
80*da21d850SDavid van Moolenbroek 	 * NR_PTYS is low enough that we can always return it instead of
81*da21d850SDavid van Moolenbroek 	 * tracking the actual value.
82*da21d850SDavid van Moolenbroek 	 */
83*da21d850SDavid van Moolenbroek 	return NR_PTYS;
84*da21d850SDavid van Moolenbroek }
85