xref: /aosp_15_r20/external/selinux/checkpolicy/queue.h (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker 
2*2d543d20SAndroid Build Coastguard Worker /* Author : Stephen Smalley, <[email protected]> */
3*2d543d20SAndroid Build Coastguard Worker 
4*2d543d20SAndroid Build Coastguard Worker /* FLASK */
5*2d543d20SAndroid Build Coastguard Worker 
6*2d543d20SAndroid Build Coastguard Worker /*
7*2d543d20SAndroid Build Coastguard Worker  * A double-ended queue is a singly linked list of
8*2d543d20SAndroid Build Coastguard Worker  * elements of arbitrary type that may be accessed
9*2d543d20SAndroid Build Coastguard Worker  * at either end.
10*2d543d20SAndroid Build Coastguard Worker  */
11*2d543d20SAndroid Build Coastguard Worker 
12*2d543d20SAndroid Build Coastguard Worker #ifndef _QUEUE_H_
13*2d543d20SAndroid Build Coastguard Worker #define _QUEUE_H_
14*2d543d20SAndroid Build Coastguard Worker 
15*2d543d20SAndroid Build Coastguard Worker typedef void *queue_element_t;
16*2d543d20SAndroid Build Coastguard Worker 
17*2d543d20SAndroid Build Coastguard Worker typedef struct queue_node *queue_node_ptr_t;
18*2d543d20SAndroid Build Coastguard Worker 
19*2d543d20SAndroid Build Coastguard Worker typedef struct queue_node {
20*2d543d20SAndroid Build Coastguard Worker 	queue_element_t element;
21*2d543d20SAndroid Build Coastguard Worker 	queue_node_ptr_t next;
22*2d543d20SAndroid Build Coastguard Worker } queue_node_t;
23*2d543d20SAndroid Build Coastguard Worker 
24*2d543d20SAndroid Build Coastguard Worker typedef struct queue_info {
25*2d543d20SAndroid Build Coastguard Worker 	queue_node_ptr_t head;
26*2d543d20SAndroid Build Coastguard Worker 	queue_node_ptr_t tail;
27*2d543d20SAndroid Build Coastguard Worker } queue_info_t;
28*2d543d20SAndroid Build Coastguard Worker 
29*2d543d20SAndroid Build Coastguard Worker typedef queue_info_t *queue_t;
30*2d543d20SAndroid Build Coastguard Worker 
31*2d543d20SAndroid Build Coastguard Worker queue_t queue_create(void);
32*2d543d20SAndroid Build Coastguard Worker int queue_insert(queue_t, queue_element_t);
33*2d543d20SAndroid Build Coastguard Worker int queue_push(queue_t, queue_element_t);
34*2d543d20SAndroid Build Coastguard Worker queue_element_t queue_remove(queue_t);
35*2d543d20SAndroid Build Coastguard Worker queue_element_t queue_head(queue_t);
36*2d543d20SAndroid Build Coastguard Worker void queue_destroy(queue_t);
37*2d543d20SAndroid Build Coastguard Worker 
38*2d543d20SAndroid Build Coastguard Worker /*
39*2d543d20SAndroid Build Coastguard Worker    Applies the specified function f to each element in the
40*2d543d20SAndroid Build Coastguard Worker    specified queue.
41*2d543d20SAndroid Build Coastguard Worker 
42*2d543d20SAndroid Build Coastguard Worker    In addition to passing the element to f, queue_map
43*2d543d20SAndroid Build Coastguard Worker    passes the specified void* pointer to f on each invocation.
44*2d543d20SAndroid Build Coastguard Worker 
45*2d543d20SAndroid Build Coastguard Worker    If f returns a non-zero status, then queue_map will cease
46*2d543d20SAndroid Build Coastguard Worker    iterating through the hash table and will propagate the error
47*2d543d20SAndroid Build Coastguard Worker    return to its caller.
48*2d543d20SAndroid Build Coastguard Worker  */
49*2d543d20SAndroid Build Coastguard Worker int queue_map(queue_t, int (*f) (queue_element_t, void *), void *);
50*2d543d20SAndroid Build Coastguard Worker 
51*2d543d20SAndroid Build Coastguard Worker /*
52*2d543d20SAndroid Build Coastguard Worker    Same as queue_map, except that if f returns a non-zero status,
53*2d543d20SAndroid Build Coastguard Worker    then the element will be removed from the queue and the g
54*2d543d20SAndroid Build Coastguard Worker    function will be applied to the element.
55*2d543d20SAndroid Build Coastguard Worker  */
56*2d543d20SAndroid Build Coastguard Worker void queue_map_remove_on_error(queue_t,
57*2d543d20SAndroid Build Coastguard Worker 			       int (*f) (queue_element_t, void *),
58*2d543d20SAndroid Build Coastguard Worker 			       void (*g) (queue_element_t, void *), void *);
59*2d543d20SAndroid Build Coastguard Worker 
60*2d543d20SAndroid Build Coastguard Worker #endif
61*2d543d20SAndroid Build Coastguard Worker 
62*2d543d20SAndroid Build Coastguard Worker /* FLASK */
63