xref: /freebsd/contrib/ofed/opensm/include/complib/cl_qlist.h (revision 87181516ef48be852d5e5fee53c6e0dbfc62f21e)
1*d6b92ffaSHans Petter Selasky /*
2*d6b92ffaSHans Petter Selasky  * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
3*d6b92ffaSHans Petter Selasky  * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
4*d6b92ffaSHans Petter Selasky  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5*d6b92ffaSHans Petter Selasky  *
6*d6b92ffaSHans Petter Selasky  * This software is available to you under a choice of one of two
7*d6b92ffaSHans Petter Selasky  * licenses.  You may choose to be licensed under the terms of the GNU
8*d6b92ffaSHans Petter Selasky  * General Public License (GPL) Version 2, available from the file
9*d6b92ffaSHans Petter Selasky  * COPYING in the main directory of this source tree, or the
10*d6b92ffaSHans Petter Selasky  * OpenIB.org BSD license below:
11*d6b92ffaSHans Petter Selasky  *
12*d6b92ffaSHans Petter Selasky  *     Redistribution and use in source and binary forms, with or
13*d6b92ffaSHans Petter Selasky  *     without modification, are permitted provided that the following
14*d6b92ffaSHans Petter Selasky  *     conditions are met:
15*d6b92ffaSHans Petter Selasky  *
16*d6b92ffaSHans Petter Selasky  *      - Redistributions of source code must retain the above
17*d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
18*d6b92ffaSHans Petter Selasky  *        disclaimer.
19*d6b92ffaSHans Petter Selasky  *
20*d6b92ffaSHans Petter Selasky  *      - Redistributions in binary form must reproduce the above
21*d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
22*d6b92ffaSHans Petter Selasky  *        disclaimer in the documentation and/or other materials
23*d6b92ffaSHans Petter Selasky  *        provided with the distribution.
24*d6b92ffaSHans Petter Selasky  *
25*d6b92ffaSHans Petter Selasky  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26*d6b92ffaSHans Petter Selasky  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27*d6b92ffaSHans Petter Selasky  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28*d6b92ffaSHans Petter Selasky  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29*d6b92ffaSHans Petter Selasky  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30*d6b92ffaSHans Petter Selasky  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31*d6b92ffaSHans Petter Selasky  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32*d6b92ffaSHans Petter Selasky  * SOFTWARE.
33*d6b92ffaSHans Petter Selasky  *
34*d6b92ffaSHans Petter Selasky  */
35*d6b92ffaSHans Petter Selasky 
36*d6b92ffaSHans Petter Selasky /*
37*d6b92ffaSHans Petter Selasky  * Abstract:
38*d6b92ffaSHans Petter Selasky  *	Declaration of quick list.
39*d6b92ffaSHans Petter Selasky  */
40*d6b92ffaSHans Petter Selasky 
41*d6b92ffaSHans Petter Selasky #ifndef _CL_QUICK_LIST_H_
42*d6b92ffaSHans Petter Selasky #define _CL_QUICK_LIST_H_
43*d6b92ffaSHans Petter Selasky 
44*d6b92ffaSHans Petter Selasky #include <complib/cl_types.h>
45*d6b92ffaSHans Petter Selasky 
46*d6b92ffaSHans Petter Selasky #ifdef __cplusplus
47*d6b92ffaSHans Petter Selasky #  define BEGIN_C_DECLS extern "C" {
48*d6b92ffaSHans Petter Selasky #  define END_C_DECLS   }
49*d6b92ffaSHans Petter Selasky #else				/* !__cplusplus */
50*d6b92ffaSHans Petter Selasky #  define BEGIN_C_DECLS
51*d6b92ffaSHans Petter Selasky #  define END_C_DECLS
52*d6b92ffaSHans Petter Selasky #endif				/* __cplusplus */
53*d6b92ffaSHans Petter Selasky 
54*d6b92ffaSHans Petter Selasky BEGIN_C_DECLS
55*d6b92ffaSHans Petter Selasky /****h* Component Library/Quick List
56*d6b92ffaSHans Petter Selasky * NAME
57*d6b92ffaSHans Petter Selasky *	Quick List
58*d6b92ffaSHans Petter Selasky *
59*d6b92ffaSHans Petter Selasky * DESCRIPTION
60*d6b92ffaSHans Petter Selasky *	Quick list implements a doubly linked that stores user provided
61*d6b92ffaSHans Petter Selasky *	cl_list_item_t structures.
62*d6b92ffaSHans Petter Selasky *	Quick list does not allocate any memory, and can therefore not fail any
63*d6b92ffaSHans Petter Selasky *	operations.  Quick list can therefore be useful in minimizing the error
64*d6b92ffaSHans Petter Selasky *	paths in code.
65*d6b92ffaSHans Petter Selasky *
66*d6b92ffaSHans Petter Selasky *	Quick list is not thread safe, and users must provide serialization when
67*d6b92ffaSHans Petter Selasky *	adding and removing items from the list. Note that it is possible to
68*d6b92ffaSHans Petter Selasky *	walk a quick list while simultaneously adding to it.
69*d6b92ffaSHans Petter Selasky *
70*d6b92ffaSHans Petter Selasky *	The Quick List functions operate on a cl_qlist_t structure which should be
71*d6b92ffaSHans Petter Selasky *	treated as opaque and should be manipulated only through the provided
72*d6b92ffaSHans Petter Selasky *	functions.
73*d6b92ffaSHans Petter Selasky *
74*d6b92ffaSHans Petter Selasky * SEE ALSO
75*d6b92ffaSHans Petter Selasky *	Structures:
76*d6b92ffaSHans Petter Selasky *		cl_qlist_t, cl_list_item_t, cl_list_obj_t
77*d6b92ffaSHans Petter Selasky *
78*d6b92ffaSHans Petter Selasky *	Callbacks:
79*d6b92ffaSHans Petter Selasky *		cl_pfn_qlist_apply_t, cl_pfn_qlist_find_t
80*d6b92ffaSHans Petter Selasky *
81*d6b92ffaSHans Petter Selasky *	Item Manipulation:
82*d6b92ffaSHans Petter Selasky *		cl_qlist_set_obj, cl_qlist_obj
83*d6b92ffaSHans Petter Selasky *
84*d6b92ffaSHans Petter Selasky *	Initialization:
85*d6b92ffaSHans Petter Selasky *		cl_qlist_init
86*d6b92ffaSHans Petter Selasky *
87*d6b92ffaSHans Petter Selasky *	Iteration:
88*d6b92ffaSHans Petter Selasky *		cl_qlist_next, cl_qlist_prev, cl_qlist_head, cl_qlist_tail,
89*d6b92ffaSHans Petter Selasky *		cl_qlist_end
90*d6b92ffaSHans Petter Selasky *
91*d6b92ffaSHans Petter Selasky *	Manipulation:
92*d6b92ffaSHans Petter Selasky *		cl_qlist_insert_head, cl_qlist_insert_tail,
93*d6b92ffaSHans Petter Selasky *		cl_qlist_insert_list_head, cl_qlist_insert_list_tail,
94*d6b92ffaSHans Petter Selasky *		cl_qlist_insert_array_head, cl_qlist_insert_array_tail,
95*d6b92ffaSHans Petter Selasky *		cl_qlist_insert_prev, cl_qlist_insert_next,
96*d6b92ffaSHans Petter Selasky *		cl_qlist_remove_head, cl_qlist_remove_tail,
97*d6b92ffaSHans Petter Selasky *		cl_qlist_remove_item, cl_qlist_remove_all
98*d6b92ffaSHans Petter Selasky *
99*d6b92ffaSHans Petter Selasky *	Search:
100*d6b92ffaSHans Petter Selasky *		cl_is_item_in_qlist, cl_qlist_find_next, cl_qlist_find_prev,
101*d6b92ffaSHans Petter Selasky *		cl_qlist_find_from_head, cl_qlist_find_from_tail
102*d6b92ffaSHans Petter Selasky *		cl_qlist_apply_func, cl_qlist_move_items
103*d6b92ffaSHans Petter Selasky *
104*d6b92ffaSHans Petter Selasky *	Attributes:
105*d6b92ffaSHans Petter Selasky *		cl_qlist_count, cl_is_qlist_empty
106*d6b92ffaSHans Petter Selasky *********/
107*d6b92ffaSHans Petter Selasky /****s* Component Library: Quick List/cl_list_item_t
108*d6b92ffaSHans Petter Selasky * NAME
109*d6b92ffaSHans Petter Selasky *	cl_list_item_t
110*d6b92ffaSHans Petter Selasky *
111*d6b92ffaSHans Petter Selasky * DESCRIPTION
112*d6b92ffaSHans Petter Selasky *	The cl_list_item_t structure is used by lists to store objects.
113*d6b92ffaSHans Petter Selasky *
114*d6b92ffaSHans Petter Selasky * SYNOPSIS
115*d6b92ffaSHans Petter Selasky */
116*d6b92ffaSHans Petter Selasky typedef struct _cl_list_item {
117*d6b92ffaSHans Petter Selasky 	struct _cl_list_item *p_next;
118*d6b92ffaSHans Petter Selasky 	struct _cl_list_item *p_prev;
119*d6b92ffaSHans Petter Selasky #ifdef _DEBUG_
120*d6b92ffaSHans Petter Selasky 	struct _cl_qlist *p_list;
121*d6b92ffaSHans Petter Selasky #endif
122*d6b92ffaSHans Petter Selasky } cl_list_item_t;
123*d6b92ffaSHans Petter Selasky /*
124*d6b92ffaSHans Petter Selasky * FIELDS
125*d6b92ffaSHans Petter Selasky *	p_next
126*d6b92ffaSHans Petter Selasky *		Used internally by the list. Users should not use this field.
127*d6b92ffaSHans Petter Selasky *
128*d6b92ffaSHans Petter Selasky *	p_prev
129*d6b92ffaSHans Petter Selasky *		Used internally by the list. Users should not use this field.
130*d6b92ffaSHans Petter Selasky *
131*d6b92ffaSHans Petter Selasky * SEE ALSO
132*d6b92ffaSHans Petter Selasky *	Quick List
133*d6b92ffaSHans Petter Selasky *********/
134*d6b92ffaSHans Petter Selasky 
135*d6b92ffaSHans Petter Selasky #define cl_item_obj(item_ptr, obj_ptr, item_field) (typeof(obj_ptr)) \
136*d6b92ffaSHans Petter Selasky 	((void *)item_ptr - (unsigned long)&((typeof(obj_ptr))0)->item_field)
137*d6b92ffaSHans Petter Selasky 
138*d6b92ffaSHans Petter Selasky 
139*d6b92ffaSHans Petter Selasky /****s* Component Library: Quick List/cl_list_obj_t
140*d6b92ffaSHans Petter Selasky * NAME
141*d6b92ffaSHans Petter Selasky *	cl_list_obj_t
142*d6b92ffaSHans Petter Selasky *
143*d6b92ffaSHans Petter Selasky * DESCRIPTION
144*d6b92ffaSHans Petter Selasky *	The cl_list_obj_t structure is used by lists to store objects.
145*d6b92ffaSHans Petter Selasky *
146*d6b92ffaSHans Petter Selasky * SYNOPSIS
147*d6b92ffaSHans Petter Selasky */
148*d6b92ffaSHans Petter Selasky typedef struct _cl_list_obj {
149*d6b92ffaSHans Petter Selasky 	cl_list_item_t list_item;
150*d6b92ffaSHans Petter Selasky 	const void *p_object;	/* User's context */
151*d6b92ffaSHans Petter Selasky } cl_list_obj_t;
152*d6b92ffaSHans Petter Selasky /*
153*d6b92ffaSHans Petter Selasky * FIELDS
154*d6b92ffaSHans Petter Selasky *	list_item
155*d6b92ffaSHans Petter Selasky *		Used internally by the list. Users should not use this field.
156*d6b92ffaSHans Petter Selasky *
157*d6b92ffaSHans Petter Selasky *	p_object
158*d6b92ffaSHans Petter Selasky *		User defined context. Users should not access this field directly.
159*d6b92ffaSHans Petter Selasky *		Use cl_qlist_set_obj and cl_qlist_obj to set and retrieve the value
160*d6b92ffaSHans Petter Selasky *		of this field.
161*d6b92ffaSHans Petter Selasky *
162*d6b92ffaSHans Petter Selasky * NOTES
163*d6b92ffaSHans Petter Selasky *	Users can use the cl_qlist_set_obj and cl_qlist_obj functions to store
164*d6b92ffaSHans Petter Selasky *	and retrieve context information in the list item.
165*d6b92ffaSHans Petter Selasky *
166*d6b92ffaSHans Petter Selasky * SEE ALSO
167*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_set_obj, cl_qlist_obj, cl_list_item_t
168*d6b92ffaSHans Petter Selasky *********/
169*d6b92ffaSHans Petter Selasky 
170*d6b92ffaSHans Petter Selasky /****s* Component Library: Quick List/cl_qlist_t
171*d6b92ffaSHans Petter Selasky * NAME
172*d6b92ffaSHans Petter Selasky *	cl_qlist_t
173*d6b92ffaSHans Petter Selasky *
174*d6b92ffaSHans Petter Selasky * DESCRIPTION
175*d6b92ffaSHans Petter Selasky *	Quick list structure.
176*d6b92ffaSHans Petter Selasky *
177*d6b92ffaSHans Petter Selasky *	The cl_qlist_t structure should be treated as opaque and should be
178*d6b92ffaSHans Petter Selasky *	manipulated only through the provided functions.
179*d6b92ffaSHans Petter Selasky *
180*d6b92ffaSHans Petter Selasky * SYNOPSIS
181*d6b92ffaSHans Petter Selasky */
182*d6b92ffaSHans Petter Selasky typedef struct _cl_qlist {
183*d6b92ffaSHans Petter Selasky 	cl_list_item_t end;
184*d6b92ffaSHans Petter Selasky 	size_t count;
185*d6b92ffaSHans Petter Selasky 	cl_state_t state;
186*d6b92ffaSHans Petter Selasky } cl_qlist_t;
187*d6b92ffaSHans Petter Selasky /*
188*d6b92ffaSHans Petter Selasky * FIELDS
189*d6b92ffaSHans Petter Selasky *	end
190*d6b92ffaSHans Petter Selasky *		List item used to mark the end of the list.
191*d6b92ffaSHans Petter Selasky *
192*d6b92ffaSHans Petter Selasky *	count
193*d6b92ffaSHans Petter Selasky *		Number of items in the list.
194*d6b92ffaSHans Petter Selasky *
195*d6b92ffaSHans Petter Selasky *	state
196*d6b92ffaSHans Petter Selasky *		State of the quick list.
197*d6b92ffaSHans Petter Selasky *
198*d6b92ffaSHans Petter Selasky * SEE ALSO
199*d6b92ffaSHans Petter Selasky *	Quick List
200*d6b92ffaSHans Petter Selasky *********/
201*d6b92ffaSHans Petter Selasky 
202*d6b92ffaSHans Petter Selasky /****d* Component Library: Quick List/cl_pfn_qlist_apply_t
203*d6b92ffaSHans Petter Selasky * NAME
204*d6b92ffaSHans Petter Selasky *	cl_pfn_qlist_apply_t
205*d6b92ffaSHans Petter Selasky *
206*d6b92ffaSHans Petter Selasky * DESCRIPTION
207*d6b92ffaSHans Petter Selasky *	The cl_pfn_qlist_apply_t function type defines the prototype for functions
208*d6b92ffaSHans Petter Selasky *	used to iterate items in a quick list.
209*d6b92ffaSHans Petter Selasky *
210*d6b92ffaSHans Petter Selasky * SYNOPSIS
211*d6b92ffaSHans Petter Selasky */
212*d6b92ffaSHans Petter Selasky typedef void
213*d6b92ffaSHans Petter Selasky  (*cl_pfn_qlist_apply_t) (IN cl_list_item_t * const p_list_item,
214*d6b92ffaSHans Petter Selasky 			  IN void *context);
215*d6b92ffaSHans Petter Selasky /*
216*d6b92ffaSHans Petter Selasky * PARAMETERS
217*d6b92ffaSHans Petter Selasky *	p_list_item
218*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_list_item_t structure.
219*d6b92ffaSHans Petter Selasky *
220*d6b92ffaSHans Petter Selasky *	context
221*d6b92ffaSHans Petter Selasky *		[in] Value passed to the callback function.
222*d6b92ffaSHans Petter Selasky *
223*d6b92ffaSHans Petter Selasky * RETURN VALUE
224*d6b92ffaSHans Petter Selasky *	This function does not return a value.
225*d6b92ffaSHans Petter Selasky *
226*d6b92ffaSHans Petter Selasky * NOTES
227*d6b92ffaSHans Petter Selasky *	This function type is provided as function prototype reference for the
228*d6b92ffaSHans Petter Selasky *	function provided by users as a parameter to the cl_qlist_apply_func
229*d6b92ffaSHans Petter Selasky *	function.
230*d6b92ffaSHans Petter Selasky *
231*d6b92ffaSHans Petter Selasky * SEE ALSO
232*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_apply_func
233*d6b92ffaSHans Petter Selasky *********/
234*d6b92ffaSHans Petter Selasky 
235*d6b92ffaSHans Petter Selasky /****d* Component Library: Quick List/cl_pfn_qlist_find_t
236*d6b92ffaSHans Petter Selasky * NAME
237*d6b92ffaSHans Petter Selasky *	cl_pfn_qlist_find_t
238*d6b92ffaSHans Petter Selasky *
239*d6b92ffaSHans Petter Selasky * DESCRIPTION
240*d6b92ffaSHans Petter Selasky *	The cl_pfn_qlist_find_t function type defines the prototype for functions
241*d6b92ffaSHans Petter Selasky *	used to find items in a quick list.
242*d6b92ffaSHans Petter Selasky *
243*d6b92ffaSHans Petter Selasky * SYNOPSIS
244*d6b92ffaSHans Petter Selasky */
245*d6b92ffaSHans Petter Selasky typedef cl_status_t
246*d6b92ffaSHans Petter Selasky     (*cl_pfn_qlist_find_t) (IN const cl_list_item_t * const p_list_item,
247*d6b92ffaSHans Petter Selasky 			    IN void *context);
248*d6b92ffaSHans Petter Selasky /*
249*d6b92ffaSHans Petter Selasky * PARAMETERS
250*d6b92ffaSHans Petter Selasky *	p_list_item
251*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_list_item_t.
252*d6b92ffaSHans Petter Selasky *
253*d6b92ffaSHans Petter Selasky *	context
254*d6b92ffaSHans Petter Selasky *		[in] Value passed to the callback function.
255*d6b92ffaSHans Petter Selasky *
256*d6b92ffaSHans Petter Selasky * RETURN VALUES
257*d6b92ffaSHans Petter Selasky *	Return CL_SUCCESS if the desired item was found. This stops list iteration.
258*d6b92ffaSHans Petter Selasky *
259*d6b92ffaSHans Petter Selasky *	Return CL_NOT_FOUND to continue list iteration.
260*d6b92ffaSHans Petter Selasky *
261*d6b92ffaSHans Petter Selasky * NOTES
262*d6b92ffaSHans Petter Selasky *	This function type is provided as function prototype reference for the
263*d6b92ffaSHans Petter Selasky *	function provided by users as a parameter to the cl_qlist_find_from_head,
264*d6b92ffaSHans Petter Selasky *	cl_qlist_find_from_tail, cl_qlist_find_next, and cl_qlist_find_prev
265*d6b92ffaSHans Petter Selasky *	functions.
266*d6b92ffaSHans Petter Selasky *
267*d6b92ffaSHans Petter Selasky * SEE ALSO
268*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_find_from_head, cl_qlist_find_from_tail,
269*d6b92ffaSHans Petter Selasky *	cl_qlist_find_next, cl_qlist_find_prev
270*d6b92ffaSHans Petter Selasky *********/
271*d6b92ffaSHans Petter Selasky 
272*d6b92ffaSHans Petter Selasky /****i* Component Library: Quick List/__cl_primitive_insert
273*d6b92ffaSHans Petter Selasky * NAME
274*d6b92ffaSHans Petter Selasky *	__cl_primitive_insert
275*d6b92ffaSHans Petter Selasky *
276*d6b92ffaSHans Petter Selasky * DESCRIPTION
277*d6b92ffaSHans Petter Selasky *	Add a new item in front of the specified item.  This is a low level
278*d6b92ffaSHans Petter Selasky *	function for use internally by the queuing routines.
279*d6b92ffaSHans Petter Selasky *
280*d6b92ffaSHans Petter Selasky * SYNOPSIS
281*d6b92ffaSHans Petter Selasky */
282*d6b92ffaSHans Petter Selasky static inline void
__cl_primitive_insert(IN cl_list_item_t * const p_list_item,IN cl_list_item_t * const p_new_item)283*d6b92ffaSHans Petter Selasky __cl_primitive_insert(IN cl_list_item_t * const p_list_item,
284*d6b92ffaSHans Petter Selasky 		      IN cl_list_item_t * const p_new_item)
285*d6b92ffaSHans Petter Selasky {
286*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
287*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list_item);
288*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
289*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_new_item);
290*d6b92ffaSHans Petter Selasky 
291*d6b92ffaSHans Petter Selasky 	p_new_item->p_next = p_list_item;
292*d6b92ffaSHans Petter Selasky 	p_new_item->p_prev = p_list_item->p_prev;
293*d6b92ffaSHans Petter Selasky 	p_list_item->p_prev = p_new_item;
294*d6b92ffaSHans Petter Selasky 	p_new_item->p_prev->p_next = p_new_item;
295*d6b92ffaSHans Petter Selasky }
296*d6b92ffaSHans Petter Selasky 
297*d6b92ffaSHans Petter Selasky /*
298*d6b92ffaSHans Petter Selasky * PARAMETERS
299*d6b92ffaSHans Petter Selasky *	p_list_item
300*d6b92ffaSHans Petter Selasky *		[in] Pointer to cl_list_item_t to insert in front of
301*d6b92ffaSHans Petter Selasky *
302*d6b92ffaSHans Petter Selasky *	p_new_item
303*d6b92ffaSHans Petter Selasky *		[in] Pointer to cl_list_item_t to add
304*d6b92ffaSHans Petter Selasky *
305*d6b92ffaSHans Petter Selasky * RETURN VALUE
306*d6b92ffaSHans Petter Selasky *	This function does not return a value.
307*d6b92ffaSHans Petter Selasky *********/
308*d6b92ffaSHans Petter Selasky 
309*d6b92ffaSHans Petter Selasky /****i* Component Library: Quick List/__cl_primitive_remove
310*d6b92ffaSHans Petter Selasky * NAME
311*d6b92ffaSHans Petter Selasky *	__cl_primitive_remove
312*d6b92ffaSHans Petter Selasky *
313*d6b92ffaSHans Petter Selasky * DESCRIPTION
314*d6b92ffaSHans Petter Selasky *	Remove an item from a list.  This is a low level routine
315*d6b92ffaSHans Petter Selasky *	for use internally by the queuing routines.
316*d6b92ffaSHans Petter Selasky *
317*d6b92ffaSHans Petter Selasky * SYNOPSIS
318*d6b92ffaSHans Petter Selasky */
__cl_primitive_remove(IN cl_list_item_t * const p_list_item)319*d6b92ffaSHans Petter Selasky static inline void __cl_primitive_remove(IN cl_list_item_t * const p_list_item)
320*d6b92ffaSHans Petter Selasky {
321*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
322*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list_item);
323*d6b92ffaSHans Petter Selasky 
324*d6b92ffaSHans Petter Selasky 	/* set the back pointer */
325*d6b92ffaSHans Petter Selasky 	p_list_item->p_next->p_prev = p_list_item->p_prev;
326*d6b92ffaSHans Petter Selasky 	/* set the next pointer */
327*d6b92ffaSHans Petter Selasky 	p_list_item->p_prev->p_next = p_list_item->p_next;
328*d6b92ffaSHans Petter Selasky 
329*d6b92ffaSHans Petter Selasky 	/* if we're debugging, spruce up the pointers to help find bugs */
330*d6b92ffaSHans Petter Selasky #if defined( _DEBUG_ )
331*d6b92ffaSHans Petter Selasky 	if (p_list_item != p_list_item->p_next) {
332*d6b92ffaSHans Petter Selasky 		p_list_item->p_next = NULL;
333*d6b92ffaSHans Petter Selasky 		p_list_item->p_prev = NULL;
334*d6b92ffaSHans Petter Selasky 	}
335*d6b92ffaSHans Petter Selasky #endif				/* defined( _DEBUG_ ) */
336*d6b92ffaSHans Petter Selasky }
337*d6b92ffaSHans Petter Selasky 
338*d6b92ffaSHans Petter Selasky /*
339*d6b92ffaSHans Petter Selasky * PARAMETERS
340*d6b92ffaSHans Petter Selasky *	p_list_item
341*d6b92ffaSHans Petter Selasky *		[in] Pointer to cl_list_item_t to remove
342*d6b92ffaSHans Petter Selasky *
343*d6b92ffaSHans Petter Selasky * RETURN VALUE
344*d6b92ffaSHans Petter Selasky *	This function does not return a value.
345*d6b92ffaSHans Petter Selasky *********/
346*d6b92ffaSHans Petter Selasky 
347*d6b92ffaSHans Petter Selasky /*
348*d6b92ffaSHans Petter Selasky  * Declaration of quick list functions
349*d6b92ffaSHans Petter Selasky  */
350*d6b92ffaSHans Petter Selasky 
351*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_set_obj
352*d6b92ffaSHans Petter Selasky * NAME
353*d6b92ffaSHans Petter Selasky *	cl_qlist_set_obj
354*d6b92ffaSHans Petter Selasky *
355*d6b92ffaSHans Petter Selasky * DESCRIPTION
356*d6b92ffaSHans Petter Selasky *	The cl_qlist_set_obj function sets the object stored in a list object.
357*d6b92ffaSHans Petter Selasky *
358*d6b92ffaSHans Petter Selasky * SYNOPSIS
359*d6b92ffaSHans Petter Selasky */
360*d6b92ffaSHans Petter Selasky static inline void
cl_qlist_set_obj(IN cl_list_obj_t * const p_list_obj,IN const void * const p_object)361*d6b92ffaSHans Petter Selasky cl_qlist_set_obj(IN cl_list_obj_t * const p_list_obj,
362*d6b92ffaSHans Petter Selasky 		 IN const void *const p_object)
363*d6b92ffaSHans Petter Selasky {
364*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
365*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list_obj);
366*d6b92ffaSHans Petter Selasky 	p_list_obj->p_object = p_object;
367*d6b92ffaSHans Petter Selasky }
368*d6b92ffaSHans Petter Selasky 
369*d6b92ffaSHans Petter Selasky /*
370*d6b92ffaSHans Petter Selasky * PARAMETERS
371*d6b92ffaSHans Petter Selasky *	p_list_obj
372*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_list_obj_t structure.
373*d6b92ffaSHans Petter Selasky *
374*d6b92ffaSHans Petter Selasky *	p_object
375*d6b92ffaSHans Petter Selasky *		[in] User defined context.
376*d6b92ffaSHans Petter Selasky *
377*d6b92ffaSHans Petter Selasky * RETURN VALUE
378*d6b92ffaSHans Petter Selasky *	This function does not return a value.
379*d6b92ffaSHans Petter Selasky *
380*d6b92ffaSHans Petter Selasky * SEE ALSO
381*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_obj
382*d6b92ffaSHans Petter Selasky *********/
383*d6b92ffaSHans Petter Selasky 
384*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_obj
385*d6b92ffaSHans Petter Selasky * NAME
386*d6b92ffaSHans Petter Selasky *	cl_qlist_obj
387*d6b92ffaSHans Petter Selasky *
388*d6b92ffaSHans Petter Selasky * DESCRIPTION
389*d6b92ffaSHans Petter Selasky *	The cl_qlist_set_obj function returns the object stored in a list object.
390*d6b92ffaSHans Petter Selasky *
391*d6b92ffaSHans Petter Selasky * SYNOPSIS
392*d6b92ffaSHans Petter Selasky */
cl_qlist_obj(IN const cl_list_obj_t * const p_list_obj)393*d6b92ffaSHans Petter Selasky static inline void *cl_qlist_obj(IN const cl_list_obj_t * const p_list_obj)
394*d6b92ffaSHans Petter Selasky {
395*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
396*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list_obj);
397*d6b92ffaSHans Petter Selasky 
398*d6b92ffaSHans Petter Selasky 	return ((void *)p_list_obj->p_object);
399*d6b92ffaSHans Petter Selasky }
400*d6b92ffaSHans Petter Selasky 
401*d6b92ffaSHans Petter Selasky /*
402*d6b92ffaSHans Petter Selasky * PARAMETERS
403*d6b92ffaSHans Petter Selasky *	p_list_obj
404*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_list_obj_t structure.
405*d6b92ffaSHans Petter Selasky *
406*d6b92ffaSHans Petter Selasky * RETURN VALUE
407*d6b92ffaSHans Petter Selasky *	Returns the value of the object pointer stored in the list object.
408*d6b92ffaSHans Petter Selasky *
409*d6b92ffaSHans Petter Selasky * SEE ALSO
410*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_set_obj
411*d6b92ffaSHans Petter Selasky *********/
412*d6b92ffaSHans Petter Selasky 
__cl_qlist_reset(IN cl_qlist_t * const p_list)413*d6b92ffaSHans Petter Selasky static inline void __cl_qlist_reset(IN cl_qlist_t * const p_list)
414*d6b92ffaSHans Petter Selasky {
415*d6b92ffaSHans Petter Selasky 	/* Point the end item to itself. */
416*d6b92ffaSHans Petter Selasky 	p_list->end.p_next = &p_list->end;
417*d6b92ffaSHans Petter Selasky 	p_list->end.p_prev = &p_list->end;
418*d6b92ffaSHans Petter Selasky #if defined( _DEBUG_ )
419*d6b92ffaSHans Petter Selasky 	p_list->end.p_list = p_list;
420*d6b92ffaSHans Petter Selasky #endif
421*d6b92ffaSHans Petter Selasky 
422*d6b92ffaSHans Petter Selasky 	/* Clear the count. */
423*d6b92ffaSHans Petter Selasky 	p_list->count = 0;
424*d6b92ffaSHans Petter Selasky }
425*d6b92ffaSHans Petter Selasky 
426*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_init
427*d6b92ffaSHans Petter Selasky * NAME
428*d6b92ffaSHans Petter Selasky *	cl_qlist_init
429*d6b92ffaSHans Petter Selasky *
430*d6b92ffaSHans Petter Selasky * DESCRIPTION
431*d6b92ffaSHans Petter Selasky *	The cl_qlist_init function initializes a quick list.
432*d6b92ffaSHans Petter Selasky *
433*d6b92ffaSHans Petter Selasky * SYNOPSIS
434*d6b92ffaSHans Petter Selasky */
cl_qlist_init(IN cl_qlist_t * const p_list)435*d6b92ffaSHans Petter Selasky static inline void cl_qlist_init(IN cl_qlist_t * const p_list)
436*d6b92ffaSHans Petter Selasky {
437*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
438*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
439*d6b92ffaSHans Petter Selasky 
440*d6b92ffaSHans Petter Selasky 	p_list->state = CL_INITIALIZED;
441*d6b92ffaSHans Petter Selasky 
442*d6b92ffaSHans Petter Selasky 	/* Reset the quick list data structure. */
443*d6b92ffaSHans Petter Selasky 	__cl_qlist_reset(p_list);
444*d6b92ffaSHans Petter Selasky }
445*d6b92ffaSHans Petter Selasky 
446*d6b92ffaSHans Petter Selasky /*
447*d6b92ffaSHans Petter Selasky * PARAMETERS
448*d6b92ffaSHans Petter Selasky *	p_list
449*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure to initialize.
450*d6b92ffaSHans Petter Selasky *
451*d6b92ffaSHans Petter Selasky * RETURN VALUES
452*d6b92ffaSHans Petter Selasky *	This function does not return a value.
453*d6b92ffaSHans Petter Selasky *
454*d6b92ffaSHans Petter Selasky * NOTES
455*d6b92ffaSHans Petter Selasky *	Allows calling quick list manipulation functions.
456*d6b92ffaSHans Petter Selasky *
457*d6b92ffaSHans Petter Selasky * SEE ALSO
458*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_insert_head, cl_qlist_insert_tail,
459*d6b92ffaSHans Petter Selasky *	cl_qlist_remove_head, cl_qlist_remove_tail
460*d6b92ffaSHans Petter Selasky *********/
461*d6b92ffaSHans Petter Selasky 
462*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_count
463*d6b92ffaSHans Petter Selasky * NAME
464*d6b92ffaSHans Petter Selasky *	cl_qlist_count
465*d6b92ffaSHans Petter Selasky *
466*d6b92ffaSHans Petter Selasky * DESCRIPTION
467*d6b92ffaSHans Petter Selasky *	The cl_qlist_count function returns the number of list items stored
468*d6b92ffaSHans Petter Selasky *	in a quick list.
469*d6b92ffaSHans Petter Selasky *
470*d6b92ffaSHans Petter Selasky * SYNOPSIS
471*d6b92ffaSHans Petter Selasky */
cl_qlist_count(IN const cl_qlist_t * const p_list)472*d6b92ffaSHans Petter Selasky static inline uint32_t cl_qlist_count(IN const cl_qlist_t * const p_list)
473*d6b92ffaSHans Petter Selasky {
474*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
475*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
476*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
477*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list->state == CL_INITIALIZED);
478*d6b92ffaSHans Petter Selasky 	return ((uint32_t) p_list->count);
479*d6b92ffaSHans Petter Selasky 
480*d6b92ffaSHans Petter Selasky }
481*d6b92ffaSHans Petter Selasky 
482*d6b92ffaSHans Petter Selasky /*
483*d6b92ffaSHans Petter Selasky * PARAMETERS
484*d6b92ffaSHans Petter Selasky *	p_list
485*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure.
486*d6b92ffaSHans Petter Selasky *
487*d6b92ffaSHans Petter Selasky * RETURN VALUE
488*d6b92ffaSHans Petter Selasky *	Number of items in the list.  This function iterates though the quick
489*d6b92ffaSHans Petter Selasky *	list to count the items.
490*d6b92ffaSHans Petter Selasky *
491*d6b92ffaSHans Petter Selasky * SEE ALSO
492*d6b92ffaSHans Petter Selasky *	Quick List, cl_is_qlist_empty
493*d6b92ffaSHans Petter Selasky *********/
494*d6b92ffaSHans Petter Selasky 
495*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_is_qlist_empty
496*d6b92ffaSHans Petter Selasky * NAME
497*d6b92ffaSHans Petter Selasky *	cl_is_qlist_empty
498*d6b92ffaSHans Petter Selasky *
499*d6b92ffaSHans Petter Selasky * DESCRIPTION
500*d6b92ffaSHans Petter Selasky *	The cl_is_qlist_empty function returns whether a quick list is empty.
501*d6b92ffaSHans Petter Selasky *
502*d6b92ffaSHans Petter Selasky * SYNOPSIS
503*d6b92ffaSHans Petter Selasky */
cl_is_qlist_empty(IN const cl_qlist_t * const p_list)504*d6b92ffaSHans Petter Selasky static inline boolean_t cl_is_qlist_empty(IN const cl_qlist_t * const p_list)
505*d6b92ffaSHans Petter Selasky {
506*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
507*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
508*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
509*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list->state == CL_INITIALIZED);
510*d6b92ffaSHans Petter Selasky 
511*d6b92ffaSHans Petter Selasky 	return (!cl_qlist_count(p_list));
512*d6b92ffaSHans Petter Selasky }
513*d6b92ffaSHans Petter Selasky 
514*d6b92ffaSHans Petter Selasky /*
515*d6b92ffaSHans Petter Selasky * PARAMETERS
516*d6b92ffaSHans Petter Selasky *	p_list
517*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure.
518*d6b92ffaSHans Petter Selasky *
519*d6b92ffaSHans Petter Selasky * RETURN VALUES
520*d6b92ffaSHans Petter Selasky *	TRUE if the specified quick list is empty.
521*d6b92ffaSHans Petter Selasky *
522*d6b92ffaSHans Petter Selasky *	FALSE otherwise.
523*d6b92ffaSHans Petter Selasky *
524*d6b92ffaSHans Petter Selasky * SEE ALSO
525*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_count, cl_qlist_remove_all
526*d6b92ffaSHans Petter Selasky *********/
527*d6b92ffaSHans Petter Selasky 
528*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_next
529*d6b92ffaSHans Petter Selasky * NAME
530*d6b92ffaSHans Petter Selasky *	cl_qlist_next
531*d6b92ffaSHans Petter Selasky *
532*d6b92ffaSHans Petter Selasky * DESCRIPTION
533*d6b92ffaSHans Petter Selasky *	The cl_qlist_next function returns a pointer to the list item following
534*d6b92ffaSHans Petter Selasky *	a given list item in a quick list.
535*d6b92ffaSHans Petter Selasky *
536*d6b92ffaSHans Petter Selasky * SYNOPSIS
537*d6b92ffaSHans Petter Selasky */
cl_qlist_next(IN const cl_list_item_t * const p_list_item)538*d6b92ffaSHans Petter Selasky static inline cl_list_item_t *cl_qlist_next(IN const cl_list_item_t *
539*d6b92ffaSHans Petter Selasky 					    const p_list_item)
540*d6b92ffaSHans Petter Selasky {
541*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
542*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list_item);
543*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
544*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list_item->p_list->state == CL_INITIALIZED);
545*d6b92ffaSHans Petter Selasky 
546*d6b92ffaSHans Petter Selasky 	/* Return the next item. */
547*d6b92ffaSHans Petter Selasky 	return (p_list_item->p_next);
548*d6b92ffaSHans Petter Selasky }
549*d6b92ffaSHans Petter Selasky 
550*d6b92ffaSHans Petter Selasky /*
551*d6b92ffaSHans Petter Selasky * PARAMETERS
552*d6b92ffaSHans Petter Selasky *	p_list_item
553*d6b92ffaSHans Petter Selasky *		[in] Pointer to the cl_list_item_t whose successor to return.
554*d6b92ffaSHans Petter Selasky *
555*d6b92ffaSHans Petter Selasky * Returns:
556*d6b92ffaSHans Petter Selasky *	Pointer to the list item following the list item specified by
557*d6b92ffaSHans Petter Selasky *	the p_list_item parameter in the quick list.
558*d6b92ffaSHans Petter Selasky *
559*d6b92ffaSHans Petter Selasky *	Pointer to the list end if p_list_item was at the tail of the list.
560*d6b92ffaSHans Petter Selasky *
561*d6b92ffaSHans Petter Selasky * SEE ALSO
562*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_head, cl_qlist_tail, cl_qlist_prev, cl_qlist_end,
563*d6b92ffaSHans Petter Selasky *	cl_list_item_t
564*d6b92ffaSHans Petter Selasky *********/
565*d6b92ffaSHans Petter Selasky 
566*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_prev
567*d6b92ffaSHans Petter Selasky * NAME
568*d6b92ffaSHans Petter Selasky *	cl_qlist_prev
569*d6b92ffaSHans Petter Selasky *
570*d6b92ffaSHans Petter Selasky * DESCRIPTION
571*d6b92ffaSHans Petter Selasky *	The cl_qlist_prev function returns a poirter to the list item preceding
572*d6b92ffaSHans Petter Selasky *	a given list item in a quick list.
573*d6b92ffaSHans Petter Selasky *
574*d6b92ffaSHans Petter Selasky * SYNOPSIS
575*d6b92ffaSHans Petter Selasky */
cl_qlist_prev(IN const cl_list_item_t * const p_list_item)576*d6b92ffaSHans Petter Selasky static inline cl_list_item_t *cl_qlist_prev(IN const cl_list_item_t *
577*d6b92ffaSHans Petter Selasky 					    const p_list_item)
578*d6b92ffaSHans Petter Selasky {
579*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
580*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list_item);
581*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
582*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list_item->p_list->state == CL_INITIALIZED);
583*d6b92ffaSHans Petter Selasky 
584*d6b92ffaSHans Petter Selasky 	/* Return the previous item. */
585*d6b92ffaSHans Petter Selasky 	return (p_list_item->p_prev);
586*d6b92ffaSHans Petter Selasky }
587*d6b92ffaSHans Petter Selasky 
588*d6b92ffaSHans Petter Selasky /*
589*d6b92ffaSHans Petter Selasky * PARAMETERS
590*d6b92ffaSHans Petter Selasky *	p_list_item
591*d6b92ffaSHans Petter Selasky *		[in] Pointer to the cl_list_item_t whose predecessor to return.
592*d6b92ffaSHans Petter Selasky *
593*d6b92ffaSHans Petter Selasky * Returns:
594*d6b92ffaSHans Petter Selasky *	Pointer to the list item preceding the list item specified by
595*d6b92ffaSHans Petter Selasky *	the p_list_item parameter in the quick list.
596*d6b92ffaSHans Petter Selasky *
597*d6b92ffaSHans Petter Selasky *	Pointer to the list end if p_list_item was at the tail of the list.
598*d6b92ffaSHans Petter Selasky *
599*d6b92ffaSHans Petter Selasky * SEE ALSO
600*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_head, cl_qlist_tail, cl_qlist_next, cl_qlist_end,
601*d6b92ffaSHans Petter Selasky *	cl_list_item_t
602*d6b92ffaSHans Petter Selasky *********/
603*d6b92ffaSHans Petter Selasky 
604*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_head
605*d6b92ffaSHans Petter Selasky * NAME
606*d6b92ffaSHans Petter Selasky *	cl_qlist_head
607*d6b92ffaSHans Petter Selasky *
608*d6b92ffaSHans Petter Selasky * DESCRIPTION
609*d6b92ffaSHans Petter Selasky *	The cl_qlist_head function returns the list item at
610*d6b92ffaSHans Petter Selasky *	the head of a quick list.
611*d6b92ffaSHans Petter Selasky *
612*d6b92ffaSHans Petter Selasky * SYNOPSIS
613*d6b92ffaSHans Petter Selasky */
cl_qlist_head(IN const cl_qlist_t * const p_list)614*d6b92ffaSHans Petter Selasky static inline cl_list_item_t *cl_qlist_head(IN const cl_qlist_t * const p_list)
615*d6b92ffaSHans Petter Selasky {
616*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
617*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
618*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
619*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list->state == CL_INITIALIZED);
620*d6b92ffaSHans Petter Selasky 
621*d6b92ffaSHans Petter Selasky 	return (cl_qlist_next(&p_list->end));
622*d6b92ffaSHans Petter Selasky }
623*d6b92ffaSHans Petter Selasky 
624*d6b92ffaSHans Petter Selasky /*
625*d6b92ffaSHans Petter Selasky * PARAMETERS
626*d6b92ffaSHans Petter Selasky *	p_list
627*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure.
628*d6b92ffaSHans Petter Selasky *
629*d6b92ffaSHans Petter Selasky * RETURN VALUES
630*d6b92ffaSHans Petter Selasky *	Pointer to the list item at the head of the quick list.
631*d6b92ffaSHans Petter Selasky *
632*d6b92ffaSHans Petter Selasky *	Pointer to the list end if the list was empty.
633*d6b92ffaSHans Petter Selasky *
634*d6b92ffaSHans Petter Selasky * NOTES
635*d6b92ffaSHans Petter Selasky *	cl_qlist_head does not remove the item from the list.
636*d6b92ffaSHans Petter Selasky *
637*d6b92ffaSHans Petter Selasky * SEE ALSO
638*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_tail, cl_qlist_next, cl_qlist_prev, cl_qlist_end,
639*d6b92ffaSHans Petter Selasky *	cl_list_item_t
640*d6b92ffaSHans Petter Selasky *********/
641*d6b92ffaSHans Petter Selasky 
642*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_tail
643*d6b92ffaSHans Petter Selasky * NAME
644*d6b92ffaSHans Petter Selasky *	cl_qlist_tail
645*d6b92ffaSHans Petter Selasky *
646*d6b92ffaSHans Petter Selasky * DESCRIPTION
647*d6b92ffaSHans Petter Selasky *	The cl_qlist_tail function returns the list item at
648*d6b92ffaSHans Petter Selasky *	the tail of a quick list.
649*d6b92ffaSHans Petter Selasky *
650*d6b92ffaSHans Petter Selasky * SYNOPSIS
651*d6b92ffaSHans Petter Selasky */
cl_qlist_tail(IN const cl_qlist_t * const p_list)652*d6b92ffaSHans Petter Selasky static inline cl_list_item_t *cl_qlist_tail(IN const cl_qlist_t * const p_list)
653*d6b92ffaSHans Petter Selasky {
654*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
655*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
656*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
657*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list->state == CL_INITIALIZED);
658*d6b92ffaSHans Petter Selasky 
659*d6b92ffaSHans Petter Selasky 	return (cl_qlist_prev(&p_list->end));
660*d6b92ffaSHans Petter Selasky }
661*d6b92ffaSHans Petter Selasky 
662*d6b92ffaSHans Petter Selasky /*
663*d6b92ffaSHans Petter Selasky * PARAMETERS
664*d6b92ffaSHans Petter Selasky *	p_list
665*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure.
666*d6b92ffaSHans Petter Selasky *
667*d6b92ffaSHans Petter Selasky * RETURN VALUES
668*d6b92ffaSHans Petter Selasky *	Pointer to the list item at the tail of the quick list.
669*d6b92ffaSHans Petter Selasky *
670*d6b92ffaSHans Petter Selasky *	Pointer to the list end if the list was empty.
671*d6b92ffaSHans Petter Selasky *
672*d6b92ffaSHans Petter Selasky * NOTES
673*d6b92ffaSHans Petter Selasky *	cl_qlist_tail does not remove the item from the list.
674*d6b92ffaSHans Petter Selasky *
675*d6b92ffaSHans Petter Selasky * SEE ALSO
676*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_head, cl_qlist_next, cl_qlist_prev, cl_qlist_end,
677*d6b92ffaSHans Petter Selasky *	cl_list_item_t
678*d6b92ffaSHans Petter Selasky *********/
679*d6b92ffaSHans Petter Selasky 
680*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_end
681*d6b92ffaSHans Petter Selasky * NAME
682*d6b92ffaSHans Petter Selasky *	cl_qlist_end
683*d6b92ffaSHans Petter Selasky *
684*d6b92ffaSHans Petter Selasky * DESCRIPTION
685*d6b92ffaSHans Petter Selasky *	The cl_qlist_end function returns the end of a quick list.
686*d6b92ffaSHans Petter Selasky *
687*d6b92ffaSHans Petter Selasky * SYNOPSIS
688*d6b92ffaSHans Petter Selasky */
cl_qlist_end(IN const cl_qlist_t * const p_list)689*d6b92ffaSHans Petter Selasky static inline const cl_list_item_t *cl_qlist_end(IN const cl_qlist_t *
690*d6b92ffaSHans Petter Selasky 						 const p_list)
691*d6b92ffaSHans Petter Selasky {
692*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
693*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
694*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
695*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list->state == CL_INITIALIZED);
696*d6b92ffaSHans Petter Selasky 
697*d6b92ffaSHans Petter Selasky 	return (&p_list->end);
698*d6b92ffaSHans Petter Selasky }
699*d6b92ffaSHans Petter Selasky 
700*d6b92ffaSHans Petter Selasky /*
701*d6b92ffaSHans Petter Selasky * PARAMETERS
702*d6b92ffaSHans Petter Selasky *	p_list
703*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure.
704*d6b92ffaSHans Petter Selasky *
705*d6b92ffaSHans Petter Selasky * RETURN VALUE
706*d6b92ffaSHans Petter Selasky *	Pointer to the end of the list.
707*d6b92ffaSHans Petter Selasky *
708*d6b92ffaSHans Petter Selasky * NOTES
709*d6b92ffaSHans Petter Selasky *	cl_qlist_end is useful for determining the validity of list items returned
710*d6b92ffaSHans Petter Selasky *	by cl_qlist_head, cl_qlist_tail, cl_qlist_next, cl_qlist_prev, as well as
711*d6b92ffaSHans Petter Selasky *	the cl_qlist_find functions.  If the list item pointer returned by any of
712*d6b92ffaSHans Petter Selasky *	these functions compares to the end, the end of the list was encoutered.
713*d6b92ffaSHans Petter Selasky *	When using cl_qlist_head or cl_qlist_tail, this condition indicates that
714*d6b92ffaSHans Petter Selasky *	the list is empty.
715*d6b92ffaSHans Petter Selasky *
716*d6b92ffaSHans Petter Selasky * SEE ALSO
717*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_head, cl_qlist_tail, cl_qlist_next, cl_qlist_prev,
718*d6b92ffaSHans Petter Selasky *	cl_list_item_t
719*d6b92ffaSHans Petter Selasky *********/
720*d6b92ffaSHans Petter Selasky 
721*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_insert_head
722*d6b92ffaSHans Petter Selasky * NAME
723*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_head
724*d6b92ffaSHans Petter Selasky *
725*d6b92ffaSHans Petter Selasky * DESCRIPTION
726*d6b92ffaSHans Petter Selasky *	The cl_qlist_insert_head function inserts a list item at the
727*d6b92ffaSHans Petter Selasky *	head of a quick list.
728*d6b92ffaSHans Petter Selasky *
729*d6b92ffaSHans Petter Selasky * SYNOPSIS
730*d6b92ffaSHans Petter Selasky */
731*d6b92ffaSHans Petter Selasky static inline void
cl_qlist_insert_head(IN cl_qlist_t * const p_list,IN cl_list_item_t * const p_list_item)732*d6b92ffaSHans Petter Selasky cl_qlist_insert_head(IN cl_qlist_t * const p_list,
733*d6b92ffaSHans Petter Selasky 		     IN cl_list_item_t * const p_list_item)
734*d6b92ffaSHans Petter Selasky {
735*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
736*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
737*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
738*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list_item);
739*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
740*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list->state == CL_INITIALIZED);
741*d6b92ffaSHans Petter Selasky 
742*d6b92ffaSHans Petter Selasky 	/*
743*d6b92ffaSHans Petter Selasky 	 * The list item must not already be part of the list.  Note that this
744*d6b92ffaSHans Petter Selasky 	 * assertion may fail if an uninitialized list item happens to have its
745*d6b92ffaSHans Petter Selasky 	 * list pointer equal to the specified list.  The chances of this
746*d6b92ffaSHans Petter Selasky 	 * happening are acceptable in light of the value of this check.
747*d6b92ffaSHans Petter Selasky 	 */
748*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list_item->p_list != p_list);
749*d6b92ffaSHans Petter Selasky 
750*d6b92ffaSHans Petter Selasky #if defined( _DEBUG_ )
751*d6b92ffaSHans Petter Selasky 	p_list_item->p_list = p_list;
752*d6b92ffaSHans Petter Selasky #endif
753*d6b92ffaSHans Petter Selasky 
754*d6b92ffaSHans Petter Selasky 	/* Insert before the head. */
755*d6b92ffaSHans Petter Selasky 	__cl_primitive_insert(cl_qlist_head(p_list), p_list_item);
756*d6b92ffaSHans Petter Selasky 
757*d6b92ffaSHans Petter Selasky 	p_list->count++;
758*d6b92ffaSHans Petter Selasky }
759*d6b92ffaSHans Petter Selasky 
760*d6b92ffaSHans Petter Selasky /*
761*d6b92ffaSHans Petter Selasky * PARAMETERS
762*d6b92ffaSHans Petter Selasky *	p_list
763*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure into which to insert the object.
764*d6b92ffaSHans Petter Selasky *
765*d6b92ffaSHans Petter Selasky *	p_list_item
766*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_list_item_t structure to add.
767*d6b92ffaSHans Petter Selasky *
768*d6b92ffaSHans Petter Selasky * RETURN VALUE
769*d6b92ffaSHans Petter Selasky *	This function does not return a value.
770*d6b92ffaSHans Petter Selasky *
771*d6b92ffaSHans Petter Selasky * NOTES
772*d6b92ffaSHans Petter Selasky *	In debug builds, cl_qlist_insert_head asserts that the specified list item
773*d6b92ffaSHans Petter Selasky *	is not already in the list.
774*d6b92ffaSHans Petter Selasky *
775*d6b92ffaSHans Petter Selasky * SEE ALSO
776*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_insert_tail, cl_qlist_insert_list_head,
777*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_list_tail, cl_qlist_insert_array_head,
778*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_array_tail, cl_qlist_insert_prev, cl_qlist_insert_next,
779*d6b92ffaSHans Petter Selasky *	cl_qlist_remove_head, cl_list_item_t
780*d6b92ffaSHans Petter Selasky *********/
781*d6b92ffaSHans Petter Selasky 
782*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_insert_tail
783*d6b92ffaSHans Petter Selasky * NAME
784*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_tail
785*d6b92ffaSHans Petter Selasky *
786*d6b92ffaSHans Petter Selasky * DESCRIPTION
787*d6b92ffaSHans Petter Selasky *	The cl_qlist_insert_tail function inserts a list item at the tail
788*d6b92ffaSHans Petter Selasky *	of a quick list.
789*d6b92ffaSHans Petter Selasky *
790*d6b92ffaSHans Petter Selasky * SYNOPSIS
791*d6b92ffaSHans Petter Selasky */
792*d6b92ffaSHans Petter Selasky static inline void
cl_qlist_insert_tail(IN cl_qlist_t * const p_list,IN cl_list_item_t * const p_list_item)793*d6b92ffaSHans Petter Selasky cl_qlist_insert_tail(IN cl_qlist_t * const p_list,
794*d6b92ffaSHans Petter Selasky 		     IN cl_list_item_t * const p_list_item)
795*d6b92ffaSHans Petter Selasky {
796*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
797*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
798*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
799*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list_item);
800*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
801*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list->state == CL_INITIALIZED);
802*d6b92ffaSHans Petter Selasky 
803*d6b92ffaSHans Petter Selasky 	/*
804*d6b92ffaSHans Petter Selasky 	 * The list item must not already be part of the list.  Note that this
805*d6b92ffaSHans Petter Selasky 	 * assertion may fail if an uninitialized list item happens to have its
806*d6b92ffaSHans Petter Selasky 	 * list pointer equal to the specified list.  The chances of this
807*d6b92ffaSHans Petter Selasky 	 * happening are acceptable in light of the value of this check.
808*d6b92ffaSHans Petter Selasky 	 */
809*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list_item->p_list != p_list);
810*d6b92ffaSHans Petter Selasky 
811*d6b92ffaSHans Petter Selasky #if defined( _DEBUG_ )
812*d6b92ffaSHans Petter Selasky 	p_list_item->p_list = p_list;
813*d6b92ffaSHans Petter Selasky #endif
814*d6b92ffaSHans Petter Selasky 
815*d6b92ffaSHans Petter Selasky 	/*
816*d6b92ffaSHans Petter Selasky 	 * Put the new element in front of the end which is the same
817*d6b92ffaSHans Petter Selasky 	 * as being at the tail
818*d6b92ffaSHans Petter Selasky 	 */
819*d6b92ffaSHans Petter Selasky 	__cl_primitive_insert(&p_list->end, p_list_item);
820*d6b92ffaSHans Petter Selasky 
821*d6b92ffaSHans Petter Selasky 	p_list->count++;
822*d6b92ffaSHans Petter Selasky }
823*d6b92ffaSHans Petter Selasky 
824*d6b92ffaSHans Petter Selasky /*
825*d6b92ffaSHans Petter Selasky * PARAMETERS
826*d6b92ffaSHans Petter Selasky *	p_list
827*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure into which to insert the object.
828*d6b92ffaSHans Petter Selasky *
829*d6b92ffaSHans Petter Selasky *	p_list_item
830*d6b92ffaSHans Petter Selasky *		[in] Pointer to cl_list_item_t structure to add.
831*d6b92ffaSHans Petter Selasky *
832*d6b92ffaSHans Petter Selasky * RETURN VALUE
833*d6b92ffaSHans Petter Selasky *	This function does not return a value.
834*d6b92ffaSHans Petter Selasky *
835*d6b92ffaSHans Petter Selasky * NOTES
836*d6b92ffaSHans Petter Selasky *	In debug builds, cl_qlist_insert_tail asserts that the specified list item
837*d6b92ffaSHans Petter Selasky *	is not already in the list.
838*d6b92ffaSHans Petter Selasky *
839*d6b92ffaSHans Petter Selasky * SEE ALSO
840*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_insert_head, cl_qlist_insert_list_head,
841*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_list_tail, cl_qlist_insert_array_head,
842*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_array_tail, cl_qlist_insert_prev, cl_qlist_insert_next,
843*d6b92ffaSHans Petter Selasky *	cl_qlist_remove_tail, cl_list_item_t
844*d6b92ffaSHans Petter Selasky *********/
845*d6b92ffaSHans Petter Selasky 
846*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_insert_list_head
847*d6b92ffaSHans Petter Selasky * NAME
848*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_list_head
849*d6b92ffaSHans Petter Selasky *
850*d6b92ffaSHans Petter Selasky * DESCRIPTION
851*d6b92ffaSHans Petter Selasky *	The cl_qlist_insert_list_head function merges two quick lists by
852*d6b92ffaSHans Petter Selasky *	inserting one at the head of the other.
853*d6b92ffaSHans Petter Selasky *
854*d6b92ffaSHans Petter Selasky * SYNOPSIS
855*d6b92ffaSHans Petter Selasky */
856*d6b92ffaSHans Petter Selasky void
857*d6b92ffaSHans Petter Selasky cl_qlist_insert_list_head(IN cl_qlist_t * const p_dest_list,
858*d6b92ffaSHans Petter Selasky 			  IN cl_qlist_t * const p_src_list);
859*d6b92ffaSHans Petter Selasky /*
860*d6b92ffaSHans Petter Selasky * PARAMETERS
861*d6b92ffaSHans Petter Selasky *	p_dest_list
862*d6b92ffaSHans Petter Selasky *		[in] Pointer to destination quicklist object.
863*d6b92ffaSHans Petter Selasky *
864*d6b92ffaSHans Petter Selasky *	p_src_list
865*d6b92ffaSHans Petter Selasky *		[in] Pointer to quicklist to add.
866*d6b92ffaSHans Petter Selasky *
867*d6b92ffaSHans Petter Selasky * RETURN VALUE
868*d6b92ffaSHans Petter Selasky *	This function does not return a value.
869*d6b92ffaSHans Petter Selasky *
870*d6b92ffaSHans Petter Selasky * NOTES
871*d6b92ffaSHans Petter Selasky *	Inserts all list items in the source list to the head of the
872*d6b92ffaSHans Petter Selasky *	destination list. The ordering of the list items is preserved.
873*d6b92ffaSHans Petter Selasky *
874*d6b92ffaSHans Petter Selasky *	The list pointed to by the p_src_list parameter is empty when
875*d6b92ffaSHans Petter Selasky *	the call returns.
876*d6b92ffaSHans Petter Selasky *
877*d6b92ffaSHans Petter Selasky * SEE ALSO
878*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_insert_list_tail, cl_qlist_insert_head,
879*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_tail, cl_qlist_insert_array_head,
880*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_array_tail, cl_qlist_insert_prev, cl_qlist_insert_next,
881*d6b92ffaSHans Petter Selasky *	cl_list_item_t
882*d6b92ffaSHans Petter Selasky *********/
883*d6b92ffaSHans Petter Selasky 
884*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_insert_list_tail
885*d6b92ffaSHans Petter Selasky * NAME
886*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_list_tail
887*d6b92ffaSHans Petter Selasky *
888*d6b92ffaSHans Petter Selasky * DESCRIPTION
889*d6b92ffaSHans Petter Selasky *	The cl_qlist_insert_list_tail function merges two quick lists by
890*d6b92ffaSHans Petter Selasky *	inserting one at the tail of the other.
891*d6b92ffaSHans Petter Selasky *
892*d6b92ffaSHans Petter Selasky * SYNOPSIS
893*d6b92ffaSHans Petter Selasky */
894*d6b92ffaSHans Petter Selasky void
895*d6b92ffaSHans Petter Selasky cl_qlist_insert_list_tail(IN cl_qlist_t * const p_dest_list,
896*d6b92ffaSHans Petter Selasky 			  IN cl_qlist_t * const p_src_list);
897*d6b92ffaSHans Petter Selasky /*
898*d6b92ffaSHans Petter Selasky * PARAMETERS
899*d6b92ffaSHans Petter Selasky *	p_dest_list
900*d6b92ffaSHans Petter Selasky *		[in] Pointer to destination quicklist object
901*d6b92ffaSHans Petter Selasky *
902*d6b92ffaSHans Petter Selasky *	p_src_list
903*d6b92ffaSHans Petter Selasky *		[in] Pointer to quicklist to add
904*d6b92ffaSHans Petter Selasky *
905*d6b92ffaSHans Petter Selasky * RETURN VALUE
906*d6b92ffaSHans Petter Selasky *	This function does not return a value.
907*d6b92ffaSHans Petter Selasky *
908*d6b92ffaSHans Petter Selasky * NOTES
909*d6b92ffaSHans Petter Selasky *	Inserts all list items in the source list to the tail of the
910*d6b92ffaSHans Petter Selasky *	destination list. The ordering of the list items is preserved.
911*d6b92ffaSHans Petter Selasky *
912*d6b92ffaSHans Petter Selasky *	The list pointed to by the p_src_list parameter is empty when
913*d6b92ffaSHans Petter Selasky *	the call returns.
914*d6b92ffaSHans Petter Selasky *
915*d6b92ffaSHans Petter Selasky * SEE ALSO
916*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_insert_list_head, cl_qlist_insert_head,
917*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_tail, cl_qlist_insert_array_head,
918*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_array_tail, cl_qlist_insert_prev, cl_qlist_insert_next,
919*d6b92ffaSHans Petter Selasky *	cl_list_item_t
920*d6b92ffaSHans Petter Selasky *********/
921*d6b92ffaSHans Petter Selasky 
922*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_insert_array_head
923*d6b92ffaSHans Petter Selasky * NAME
924*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_array_head
925*d6b92ffaSHans Petter Selasky *
926*d6b92ffaSHans Petter Selasky * DESCRIPTION
927*d6b92ffaSHans Petter Selasky *	The cl_qlist_insert_array_head function inserts an array of list items
928*d6b92ffaSHans Petter Selasky *	at the head of a quick list.
929*d6b92ffaSHans Petter Selasky *
930*d6b92ffaSHans Petter Selasky * SYNOPSIS
931*d6b92ffaSHans Petter Selasky */
932*d6b92ffaSHans Petter Selasky void
933*d6b92ffaSHans Petter Selasky cl_qlist_insert_array_head(IN cl_qlist_t * const p_list,
934*d6b92ffaSHans Petter Selasky 			   IN cl_list_item_t * const p_array,
935*d6b92ffaSHans Petter Selasky 			   IN uint32_t item_count, IN const uint32_t item_size);
936*d6b92ffaSHans Petter Selasky /*
937*d6b92ffaSHans Petter Selasky * PARAMETERS
938*d6b92ffaSHans Petter Selasky *	p_list
939*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure into which to insert
940*d6b92ffaSHans Petter Selasky *		the objects.
941*d6b92ffaSHans Petter Selasky *
942*d6b92ffaSHans Petter Selasky *	p_array
943*d6b92ffaSHans Petter Selasky *		[in] Pointer to the first list item in an array of cl_list_item_t
944*d6b92ffaSHans Petter Selasky *		structures.
945*d6b92ffaSHans Petter Selasky *
946*d6b92ffaSHans Petter Selasky *	item_count
947*d6b92ffaSHans Petter Selasky *		[in] Number of cl_list_item_t structures in the array.
948*d6b92ffaSHans Petter Selasky *
949*d6b92ffaSHans Petter Selasky *	item_size
950*d6b92ffaSHans Petter Selasky *		[in] Size of the items added to the list. This is the stride in the
951*d6b92ffaSHans Petter Selasky *		array from one cl_list_item_t structure to the next.
952*d6b92ffaSHans Petter Selasky *
953*d6b92ffaSHans Petter Selasky * RETURN VALUE
954*d6b92ffaSHans Petter Selasky *	This function does not return a value.
955*d6b92ffaSHans Petter Selasky *
956*d6b92ffaSHans Petter Selasky * NOTES
957*d6b92ffaSHans Petter Selasky *	Inserts all the list items in the array specified by the p_array parameter
958*d6b92ffaSHans Petter Selasky *	to the head of the quick list specified by the p_list parameter,
959*d6b92ffaSHans Petter Selasky *	preserving ordering of the list items.
960*d6b92ffaSHans Petter Selasky *
961*d6b92ffaSHans Petter Selasky *	The array pointer passed into the function points to the cl_list_item_t
962*d6b92ffaSHans Petter Selasky *	in the first element of the caller's element array.  There is no
963*d6b92ffaSHans Petter Selasky *	restriction on where the element is stored in the parent structure.
964*d6b92ffaSHans Petter Selasky *
965*d6b92ffaSHans Petter Selasky * SEE ALSO
966*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_insert_array_tail, cl_qlist_insert_head,
967*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_tail, cl_qlist_insert_list_head, cl_qlist_insert_list_tail,
968*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_prev, cl_qlist_insert_next, cl_list_item_t
969*d6b92ffaSHans Petter Selasky *********/
970*d6b92ffaSHans Petter Selasky 
971*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_insert_array_tail
972*d6b92ffaSHans Petter Selasky * NAME
973*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_array_tail
974*d6b92ffaSHans Petter Selasky *
975*d6b92ffaSHans Petter Selasky * DESCRIPTION
976*d6b92ffaSHans Petter Selasky *	The cl_qlist_insert_array_tail function inserts an array of list items
977*d6b92ffaSHans Petter Selasky *	at the tail of a quick list.
978*d6b92ffaSHans Petter Selasky *
979*d6b92ffaSHans Petter Selasky * SYNOPSIS
980*d6b92ffaSHans Petter Selasky */
981*d6b92ffaSHans Petter Selasky void
982*d6b92ffaSHans Petter Selasky cl_qlist_insert_array_tail(IN cl_qlist_t * const p_list,
983*d6b92ffaSHans Petter Selasky 			   IN cl_list_item_t * const p_array,
984*d6b92ffaSHans Petter Selasky 			   IN uint32_t item_count, IN const uint32_t item_size);
985*d6b92ffaSHans Petter Selasky /*
986*d6b92ffaSHans Petter Selasky * PARAMETERS
987*d6b92ffaSHans Petter Selasky *	p_list
988*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure into which to insert
989*d6b92ffaSHans Petter Selasky *		the objects.
990*d6b92ffaSHans Petter Selasky *
991*d6b92ffaSHans Petter Selasky *	p_array
992*d6b92ffaSHans Petter Selasky *		[in] Pointer to the first list item in an array of cl_list_item_t
993*d6b92ffaSHans Petter Selasky *		structures.
994*d6b92ffaSHans Petter Selasky *
995*d6b92ffaSHans Petter Selasky *	item_count
996*d6b92ffaSHans Petter Selasky *		[in] Number of cl_list_item_t structures in the array.
997*d6b92ffaSHans Petter Selasky *
998*d6b92ffaSHans Petter Selasky *	item_size
999*d6b92ffaSHans Petter Selasky *		[in] Size of the items added to the list. This is the stride in the
1000*d6b92ffaSHans Petter Selasky *		array from one cl_list_item_t structure to the next.
1001*d6b92ffaSHans Petter Selasky *
1002*d6b92ffaSHans Petter Selasky * RETURN VALUE
1003*d6b92ffaSHans Petter Selasky *	This function does not return a value.
1004*d6b92ffaSHans Petter Selasky *
1005*d6b92ffaSHans Petter Selasky * NOTES
1006*d6b92ffaSHans Petter Selasky *	Inserts all the list items in the array specified by the p_array parameter
1007*d6b92ffaSHans Petter Selasky *	to the tail of the quick list specified by the p_list parameter,
1008*d6b92ffaSHans Petter Selasky *	preserving ordering of the list items.
1009*d6b92ffaSHans Petter Selasky *
1010*d6b92ffaSHans Petter Selasky *	The array pointer passed into the function points to the cl_list_item_t
1011*d6b92ffaSHans Petter Selasky *	in the first element of the caller's element array.  There is no
1012*d6b92ffaSHans Petter Selasky *	restriction on where the element is stored in the parent structure.
1013*d6b92ffaSHans Petter Selasky *
1014*d6b92ffaSHans Petter Selasky * SEE ALSO
1015*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_insert_array_head, cl_qlist_insert_head,
1016*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_tail, cl_qlist_insert_list_head, cl_qlist_insert_list_tail,
1017*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_prev, cl_qlist_insert_next, cl_list_item_t
1018*d6b92ffaSHans Petter Selasky *********/
1019*d6b92ffaSHans Petter Selasky 
1020*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_insert_prev
1021*d6b92ffaSHans Petter Selasky * NAME
1022*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_prev
1023*d6b92ffaSHans Petter Selasky *
1024*d6b92ffaSHans Petter Selasky * DESCRIPTION
1025*d6b92ffaSHans Petter Selasky *	The cl_qlist_insert_prev function inserts a list item before a
1026*d6b92ffaSHans Petter Selasky *	specified list item in a quick list.
1027*d6b92ffaSHans Petter Selasky *
1028*d6b92ffaSHans Petter Selasky * SYNOPSIS
1029*d6b92ffaSHans Petter Selasky */
1030*d6b92ffaSHans Petter Selasky static inline void
cl_qlist_insert_prev(IN cl_qlist_t * const p_list,IN cl_list_item_t * const p_list_item,IN cl_list_item_t * const p_new_item)1031*d6b92ffaSHans Petter Selasky cl_qlist_insert_prev(IN cl_qlist_t * const p_list,
1032*d6b92ffaSHans Petter Selasky 		     IN cl_list_item_t * const p_list_item,
1033*d6b92ffaSHans Petter Selasky 		     IN cl_list_item_t * const p_new_item)
1034*d6b92ffaSHans Petter Selasky {
1035*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
1036*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
1037*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
1038*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list_item);
1039*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
1040*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_new_item);
1041*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
1042*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list->state == CL_INITIALIZED);
1043*d6b92ffaSHans Petter Selasky 
1044*d6b92ffaSHans Petter Selasky 	/*
1045*d6b92ffaSHans Petter Selasky 	 * The list item must not already be part of the list.  Note that this
1046*d6b92ffaSHans Petter Selasky 	 * assertion may fail if an uninitialized list item happens to have its
1047*d6b92ffaSHans Petter Selasky 	 * list pointer equal to the specified list.  The chances of this
1048*d6b92ffaSHans Petter Selasky 	 * happening are acceptable in light of the value of this check.
1049*d6b92ffaSHans Petter Selasky 	 */
1050*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_new_item->p_list != p_list);
1051*d6b92ffaSHans Petter Selasky 
1052*d6b92ffaSHans Petter Selasky #if defined( _DEBUG_ )
1053*d6b92ffaSHans Petter Selasky 	p_new_item->p_list = p_list;
1054*d6b92ffaSHans Petter Selasky #endif
1055*d6b92ffaSHans Petter Selasky 
1056*d6b92ffaSHans Petter Selasky 	__cl_primitive_insert(p_list_item, p_new_item);
1057*d6b92ffaSHans Petter Selasky 
1058*d6b92ffaSHans Petter Selasky 	p_list->count++;
1059*d6b92ffaSHans Petter Selasky }
1060*d6b92ffaSHans Petter Selasky 
1061*d6b92ffaSHans Petter Selasky /*
1062*d6b92ffaSHans Petter Selasky * PARAMETERS
1063*d6b92ffaSHans Petter Selasky *	p_list
1064*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure into which to add the new item.
1065*d6b92ffaSHans Petter Selasky *
1066*d6b92ffaSHans Petter Selasky *	p_list_item
1067*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_list_item_t structure.
1068*d6b92ffaSHans Petter Selasky *
1069*d6b92ffaSHans Petter Selasky *	p_new_item
1070*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_list_item_t structure to add to the quick list.
1071*d6b92ffaSHans Petter Selasky *
1072*d6b92ffaSHans Petter Selasky * RETURN VALUE
1073*d6b92ffaSHans Petter Selasky *	This function does not return a value.
1074*d6b92ffaSHans Petter Selasky *
1075*d6b92ffaSHans Petter Selasky * NOTES
1076*d6b92ffaSHans Petter Selasky *	Inserts the new list item before the list item specified by p_list_item.
1077*d6b92ffaSHans Petter Selasky *
1078*d6b92ffaSHans Petter Selasky * SEE ALSO
1079*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_insert_next, cl_qlist_insert_head,
1080*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_tail, cl_qlist_insert_list_head, cl_qlist_insert_list_tail,
1081*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_array_head, cl_qlist_insert_array_tail, cl_list_item_t
1082*d6b92ffaSHans Petter Selasky *********/
1083*d6b92ffaSHans Petter Selasky 
1084*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_insert_next
1085*d6b92ffaSHans Petter Selasky * NAME
1086*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_next
1087*d6b92ffaSHans Petter Selasky *
1088*d6b92ffaSHans Petter Selasky * DESCRIPTION
1089*d6b92ffaSHans Petter Selasky *	The cl_qlist_insert_next function inserts a list item after a specified
1090*d6b92ffaSHans Petter Selasky *	list item in a quick list.
1091*d6b92ffaSHans Petter Selasky *
1092*d6b92ffaSHans Petter Selasky * SYNOPSIS
1093*d6b92ffaSHans Petter Selasky */
1094*d6b92ffaSHans Petter Selasky static inline void
cl_qlist_insert_next(IN cl_qlist_t * const p_list,IN cl_list_item_t * const p_list_item,IN cl_list_item_t * const p_new_item)1095*d6b92ffaSHans Petter Selasky cl_qlist_insert_next(IN cl_qlist_t * const p_list,
1096*d6b92ffaSHans Petter Selasky 		     IN cl_list_item_t * const p_list_item,
1097*d6b92ffaSHans Petter Selasky 		     IN cl_list_item_t * const p_new_item)
1098*d6b92ffaSHans Petter Selasky {
1099*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
1100*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
1101*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
1102*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list_item);
1103*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
1104*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_new_item);
1105*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
1106*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list->state == CL_INITIALIZED);
1107*d6b92ffaSHans Petter Selasky 
1108*d6b92ffaSHans Petter Selasky 	/*
1109*d6b92ffaSHans Petter Selasky 	 * The list item must not already be part of the list.  Note that this
1110*d6b92ffaSHans Petter Selasky 	 * assertion may fail if an uninitialized list item happens to have its
1111*d6b92ffaSHans Petter Selasky 	 * list pointer equal to the specified list.  The chances of this
1112*d6b92ffaSHans Petter Selasky 	 * happening are acceptable in light of the value of this check.
1113*d6b92ffaSHans Petter Selasky 	 */
1114*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_new_item->p_list != p_list);
1115*d6b92ffaSHans Petter Selasky 
1116*d6b92ffaSHans Petter Selasky #if defined( _DEBUG_ )
1117*d6b92ffaSHans Petter Selasky 	p_new_item->p_list = p_list;
1118*d6b92ffaSHans Petter Selasky #endif
1119*d6b92ffaSHans Petter Selasky 
1120*d6b92ffaSHans Petter Selasky 	__cl_primitive_insert(cl_qlist_next(p_list_item), p_new_item);
1121*d6b92ffaSHans Petter Selasky 
1122*d6b92ffaSHans Petter Selasky 	p_list->count++;
1123*d6b92ffaSHans Petter Selasky }
1124*d6b92ffaSHans Petter Selasky 
1125*d6b92ffaSHans Petter Selasky /*
1126*d6b92ffaSHans Petter Selasky * PARAMETERS
1127*d6b92ffaSHans Petter Selasky *	p_list
1128*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure into which to add the new item.
1129*d6b92ffaSHans Petter Selasky *
1130*d6b92ffaSHans Petter Selasky *	p_list_item
1131*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_list_item_t structure.
1132*d6b92ffaSHans Petter Selasky *
1133*d6b92ffaSHans Petter Selasky *	p_new_item
1134*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_list_item_t structure to add to the quick list.
1135*d6b92ffaSHans Petter Selasky *
1136*d6b92ffaSHans Petter Selasky * RETURN VALUE
1137*d6b92ffaSHans Petter Selasky *	This function does not return a value.
1138*d6b92ffaSHans Petter Selasky *
1139*d6b92ffaSHans Petter Selasky * NOTES
1140*d6b92ffaSHans Petter Selasky *	Inserts the new list item after the list item specified by p_list_item.
1141*d6b92ffaSHans Petter Selasky *	The list item specified by p_list_item must be in the quick list.
1142*d6b92ffaSHans Petter Selasky *
1143*d6b92ffaSHans Petter Selasky * SEE ALSO
1144*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_insert_prev, cl_qlist_insert_head,
1145*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_tail, cl_qlist_insert_list_head, cl_qlist_insert_list_tail,
1146*d6b92ffaSHans Petter Selasky *	cl_qlist_insert_array_head, cl_qlist_insert_array_tail, cl_list_item_t
1147*d6b92ffaSHans Petter Selasky *********/
1148*d6b92ffaSHans Petter Selasky 
1149*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_remove_head
1150*d6b92ffaSHans Petter Selasky * NAME
1151*d6b92ffaSHans Petter Selasky *	cl_qlist_remove_head
1152*d6b92ffaSHans Petter Selasky *
1153*d6b92ffaSHans Petter Selasky * DESCRIPTION
1154*d6b92ffaSHans Petter Selasky *	The cl_qlist_remove_head function removes and returns the list item
1155*d6b92ffaSHans Petter Selasky *	at the head of a quick list.
1156*d6b92ffaSHans Petter Selasky *
1157*d6b92ffaSHans Petter Selasky * SYNOPSIS
1158*d6b92ffaSHans Petter Selasky */
cl_qlist_remove_head(IN cl_qlist_t * const p_list)1159*d6b92ffaSHans Petter Selasky static inline cl_list_item_t *cl_qlist_remove_head(IN cl_qlist_t * const p_list)
1160*d6b92ffaSHans Petter Selasky {
1161*d6b92ffaSHans Petter Selasky 	cl_list_item_t *p_item;
1162*d6b92ffaSHans Petter Selasky 
1163*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
1164*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
1165*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
1166*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list->state == CL_INITIALIZED);
1167*d6b92ffaSHans Petter Selasky 
1168*d6b92ffaSHans Petter Selasky 	p_item = cl_qlist_head(p_list);
1169*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list item is part of the list. */
1170*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_item->p_list == p_list);
1171*d6b92ffaSHans Petter Selasky 
1172*d6b92ffaSHans Petter Selasky 	if (p_item == cl_qlist_end(p_list))
1173*d6b92ffaSHans Petter Selasky 		return (p_item);
1174*d6b92ffaSHans Petter Selasky 
1175*d6b92ffaSHans Petter Selasky #if defined( _DEBUG_ )
1176*d6b92ffaSHans Petter Selasky 	/* Clear the item's link to the list. */
1177*d6b92ffaSHans Petter Selasky 	p_item->p_list = NULL;
1178*d6b92ffaSHans Petter Selasky #endif
1179*d6b92ffaSHans Petter Selasky 
1180*d6b92ffaSHans Petter Selasky 	__cl_primitive_remove(p_item);
1181*d6b92ffaSHans Petter Selasky 
1182*d6b92ffaSHans Petter Selasky 	p_list->count--;
1183*d6b92ffaSHans Petter Selasky 
1184*d6b92ffaSHans Petter Selasky 	return (p_item);
1185*d6b92ffaSHans Petter Selasky }
1186*d6b92ffaSHans Petter Selasky 
1187*d6b92ffaSHans Petter Selasky /*
1188*d6b92ffaSHans Petter Selasky * PARAMETERS
1189*d6b92ffaSHans Petter Selasky *	p_list
1190*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure.
1191*d6b92ffaSHans Petter Selasky *
1192*d6b92ffaSHans Petter Selasky * RETURN VALUES
1193*d6b92ffaSHans Petter Selasky *	Returns a pointer to the list item formerly at the head of the quick list.
1194*d6b92ffaSHans Petter Selasky *
1195*d6b92ffaSHans Petter Selasky *	Pointer to the list end if the list was empty.
1196*d6b92ffaSHans Petter Selasky *
1197*d6b92ffaSHans Petter Selasky * SEE ALSO
1198*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_remove_tail, cl_qlist_remove_all, cl_qlist_remove_item,
1199*d6b92ffaSHans Petter Selasky *	cl_qlist_end, cl_qlist_head, cl_list_item_t
1200*d6b92ffaSHans Petter Selasky *********/
1201*d6b92ffaSHans Petter Selasky 
1202*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_remove_tail
1203*d6b92ffaSHans Petter Selasky * NAME
1204*d6b92ffaSHans Petter Selasky *	cl_qlist_remove_tail
1205*d6b92ffaSHans Petter Selasky *
1206*d6b92ffaSHans Petter Selasky * DESCRIPTION
1207*d6b92ffaSHans Petter Selasky *	The cl_qlist_remove_tail function removes and returns the list item
1208*d6b92ffaSHans Petter Selasky *	at the tail of a quick list.
1209*d6b92ffaSHans Petter Selasky *
1210*d6b92ffaSHans Petter Selasky * SYNOPSIS
1211*d6b92ffaSHans Petter Selasky */
cl_qlist_remove_tail(IN cl_qlist_t * const p_list)1212*d6b92ffaSHans Petter Selasky static inline cl_list_item_t *cl_qlist_remove_tail(IN cl_qlist_t * const p_list)
1213*d6b92ffaSHans Petter Selasky {
1214*d6b92ffaSHans Petter Selasky 	cl_list_item_t *p_item;
1215*d6b92ffaSHans Petter Selasky 
1216*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
1217*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
1218*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
1219*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list->state == CL_INITIALIZED);
1220*d6b92ffaSHans Petter Selasky 
1221*d6b92ffaSHans Petter Selasky 	p_item = cl_qlist_tail(p_list);
1222*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list item is part of the list. */
1223*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_item->p_list == p_list);
1224*d6b92ffaSHans Petter Selasky 
1225*d6b92ffaSHans Petter Selasky 	if (p_item == cl_qlist_end(p_list))
1226*d6b92ffaSHans Petter Selasky 		return (p_item);
1227*d6b92ffaSHans Petter Selasky 
1228*d6b92ffaSHans Petter Selasky #if defined( _DEBUG_ )
1229*d6b92ffaSHans Petter Selasky 	/* Clear the item's link to the list. */
1230*d6b92ffaSHans Petter Selasky 	p_item->p_list = NULL;
1231*d6b92ffaSHans Petter Selasky #endif
1232*d6b92ffaSHans Petter Selasky 
1233*d6b92ffaSHans Petter Selasky 	__cl_primitive_remove(p_item);
1234*d6b92ffaSHans Petter Selasky 
1235*d6b92ffaSHans Petter Selasky 	p_list->count--;
1236*d6b92ffaSHans Petter Selasky 
1237*d6b92ffaSHans Petter Selasky 	return (p_item);
1238*d6b92ffaSHans Petter Selasky }
1239*d6b92ffaSHans Petter Selasky 
1240*d6b92ffaSHans Petter Selasky /*
1241*d6b92ffaSHans Petter Selasky * PARAMETERS
1242*d6b92ffaSHans Petter Selasky *	p_list
1243*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure.
1244*d6b92ffaSHans Petter Selasky *
1245*d6b92ffaSHans Petter Selasky * RETURN VALUES
1246*d6b92ffaSHans Petter Selasky *	Returns a pointer to the list item formerly at the tail of the quick list.
1247*d6b92ffaSHans Petter Selasky *
1248*d6b92ffaSHans Petter Selasky *	Pointer to the list end if the list was empty.
1249*d6b92ffaSHans Petter Selasky *
1250*d6b92ffaSHans Petter Selasky * SEE ALSO
1251*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_remove_head, cl_qlist_remove_all, cl_qlist_remove_item,
1252*d6b92ffaSHans Petter Selasky *	cl_qlist_end, cl_qlist_tail, cl_list_item_t
1253*d6b92ffaSHans Petter Selasky *********/
1254*d6b92ffaSHans Petter Selasky 
1255*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_remove_item
1256*d6b92ffaSHans Petter Selasky * NAME
1257*d6b92ffaSHans Petter Selasky *	cl_qlist_remove_item
1258*d6b92ffaSHans Petter Selasky *
1259*d6b92ffaSHans Petter Selasky * DESCRIPTION
1260*d6b92ffaSHans Petter Selasky *	The cl_qlist_remove_item function removes a specific list item from a quick list.
1261*d6b92ffaSHans Petter Selasky *
1262*d6b92ffaSHans Petter Selasky * SYNOPSIS
1263*d6b92ffaSHans Petter Selasky */
1264*d6b92ffaSHans Petter Selasky static inline void
cl_qlist_remove_item(IN cl_qlist_t * const p_list,IN cl_list_item_t * const p_list_item)1265*d6b92ffaSHans Petter Selasky cl_qlist_remove_item(IN cl_qlist_t * const p_list,
1266*d6b92ffaSHans Petter Selasky 		     IN cl_list_item_t * const p_list_item)
1267*d6b92ffaSHans Petter Selasky {
1268*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
1269*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
1270*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
1271*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list_item);
1272*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
1273*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list->state == CL_INITIALIZED);
1274*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list item is part of the list. */
1275*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list_item->p_list == p_list);
1276*d6b92ffaSHans Petter Selasky 
1277*d6b92ffaSHans Petter Selasky 	if (p_list_item == cl_qlist_end(p_list))
1278*d6b92ffaSHans Petter Selasky 		return;
1279*d6b92ffaSHans Petter Selasky 
1280*d6b92ffaSHans Petter Selasky #if defined( _DEBUG_ )
1281*d6b92ffaSHans Petter Selasky 	/* Clear the item's link to the list. */
1282*d6b92ffaSHans Petter Selasky 	p_list_item->p_list = NULL;
1283*d6b92ffaSHans Petter Selasky #endif
1284*d6b92ffaSHans Petter Selasky 
1285*d6b92ffaSHans Petter Selasky 	__cl_primitive_remove(p_list_item);
1286*d6b92ffaSHans Petter Selasky 
1287*d6b92ffaSHans Petter Selasky 	p_list->count--;
1288*d6b92ffaSHans Petter Selasky }
1289*d6b92ffaSHans Petter Selasky 
1290*d6b92ffaSHans Petter Selasky /*
1291*d6b92ffaSHans Petter Selasky * PARAMETERS
1292*d6b92ffaSHans Petter Selasky *	p_list
1293*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure from which to remove the item.
1294*d6b92ffaSHans Petter Selasky *
1295*d6b92ffaSHans Petter Selasky *	p_list_item
1296*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_list_item_t structure to remove.
1297*d6b92ffaSHans Petter Selasky *
1298*d6b92ffaSHans Petter Selasky * RETURN VALUE
1299*d6b92ffaSHans Petter Selasky *	This function does not return a value.
1300*d6b92ffaSHans Petter Selasky *
1301*d6b92ffaSHans Petter Selasky * NOTES
1302*d6b92ffaSHans Petter Selasky *	Removes the list item pointed to by the p_list_item parameter from
1303*d6b92ffaSHans Petter Selasky *	its list.
1304*d6b92ffaSHans Petter Selasky *
1305*d6b92ffaSHans Petter Selasky * SEE ALSO
1306*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_remove_head, cl_qlist_remove_tail, cl_qlist_remove_all,
1307*d6b92ffaSHans Petter Selasky *	cl_list_item_t
1308*d6b92ffaSHans Petter Selasky *********/
1309*d6b92ffaSHans Petter Selasky 
1310*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_remove_all
1311*d6b92ffaSHans Petter Selasky * NAME
1312*d6b92ffaSHans Petter Selasky *	cl_qlist_remove_all
1313*d6b92ffaSHans Petter Selasky *
1314*d6b92ffaSHans Petter Selasky * DESCRIPTION
1315*d6b92ffaSHans Petter Selasky *	The cl_qlist_remove_all function removes all items from a quick list.
1316*d6b92ffaSHans Petter Selasky *
1317*d6b92ffaSHans Petter Selasky * SYNOPSIS
1318*d6b92ffaSHans Petter Selasky */
cl_qlist_remove_all(IN cl_qlist_t * const p_list)1319*d6b92ffaSHans Petter Selasky static inline void cl_qlist_remove_all(IN cl_qlist_t * const p_list)
1320*d6b92ffaSHans Petter Selasky {
1321*d6b92ffaSHans Petter Selasky #if defined( _DEBUG_ )
1322*d6b92ffaSHans Petter Selasky 	cl_list_item_t *p_list_item;
1323*d6b92ffaSHans Petter Selasky 
1324*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
1325*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
1326*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
1327*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list->state == CL_INITIALIZED);
1328*d6b92ffaSHans Petter Selasky 	p_list_item = cl_qlist_head(p_list);
1329*d6b92ffaSHans Petter Selasky 	while (p_list_item != cl_qlist_end(p_list)) {
1330*d6b92ffaSHans Petter Selasky 		p_list_item = cl_qlist_next(p_list_item);
1331*d6b92ffaSHans Petter Selasky 		cl_qlist_prev(p_list_item)->p_list = NULL;
1332*d6b92ffaSHans Petter Selasky 	}
1333*d6b92ffaSHans Petter Selasky #endif
1334*d6b92ffaSHans Petter Selasky 
1335*d6b92ffaSHans Petter Selasky 	__cl_qlist_reset(p_list);
1336*d6b92ffaSHans Petter Selasky }
1337*d6b92ffaSHans Petter Selasky 
1338*d6b92ffaSHans Petter Selasky /*
1339*d6b92ffaSHans Petter Selasky * PARAMETERS
1340*d6b92ffaSHans Petter Selasky *	p_list
1341*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure.
1342*d6b92ffaSHans Petter Selasky *
1343*d6b92ffaSHans Petter Selasky * RETURN VALUE
1344*d6b92ffaSHans Petter Selasky *	This function does not return a value.
1345*d6b92ffaSHans Petter Selasky *
1346*d6b92ffaSHans Petter Selasky * SEE ALSO
1347*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_remove_head, cl_qlist_remove_tail,
1348*d6b92ffaSHans Petter Selasky *	cl_qlist_remove_item, cl_list_item_t
1349*d6b92ffaSHans Petter Selasky *********/
1350*d6b92ffaSHans Petter Selasky 
1351*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_is_item_in_qlist
1352*d6b92ffaSHans Petter Selasky * NAME
1353*d6b92ffaSHans Petter Selasky *	cl_is_item_in_qlist
1354*d6b92ffaSHans Petter Selasky *
1355*d6b92ffaSHans Petter Selasky * DESCRIPTION
1356*d6b92ffaSHans Petter Selasky *	The cl_is_item_in_qlist function checks for the presence of a
1357*d6b92ffaSHans Petter Selasky *	list item in a quick list.
1358*d6b92ffaSHans Petter Selasky *
1359*d6b92ffaSHans Petter Selasky * SYNOPSIS
1360*d6b92ffaSHans Petter Selasky */
1361*d6b92ffaSHans Petter Selasky boolean_t
1362*d6b92ffaSHans Petter Selasky cl_is_item_in_qlist(IN const cl_qlist_t * const p_list,
1363*d6b92ffaSHans Petter Selasky 		    IN const cl_list_item_t * const p_list_item);
1364*d6b92ffaSHans Petter Selasky /*
1365*d6b92ffaSHans Petter Selasky * PARAMETERS
1366*d6b92ffaSHans Petter Selasky *	p_list
1367*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure.
1368*d6b92ffaSHans Petter Selasky *
1369*d6b92ffaSHans Petter Selasky *	p_list_item
1370*d6b92ffaSHans Petter Selasky *		[in] Pointer to the cl_list_item_t to find.
1371*d6b92ffaSHans Petter Selasky *
1372*d6b92ffaSHans Petter Selasky * RETURN VALUES
1373*d6b92ffaSHans Petter Selasky *	TRUE if the list item was found in the quick list.
1374*d6b92ffaSHans Petter Selasky *
1375*d6b92ffaSHans Petter Selasky *	FALSE otherwise.
1376*d6b92ffaSHans Petter Selasky *
1377*d6b92ffaSHans Petter Selasky * SEE ALSO
1378*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_remove_item, cl_list_item_t
1379*d6b92ffaSHans Petter Selasky *********/
1380*d6b92ffaSHans Petter Selasky 
1381*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_find_next
1382*d6b92ffaSHans Petter Selasky * NAME
1383*d6b92ffaSHans Petter Selasky *	cl_qlist_find_next
1384*d6b92ffaSHans Petter Selasky *
1385*d6b92ffaSHans Petter Selasky * DESCRIPTION
1386*d6b92ffaSHans Petter Selasky *	The cl_qlist_find_next function invokes a specified function to
1387*d6b92ffaSHans Petter Selasky *	search for an item, starting from a given list item.
1388*d6b92ffaSHans Petter Selasky *
1389*d6b92ffaSHans Petter Selasky * SYNOPSIS
1390*d6b92ffaSHans Petter Selasky */
1391*d6b92ffaSHans Petter Selasky cl_list_item_t *cl_qlist_find_next(IN const cl_qlist_t * const p_list,
1392*d6b92ffaSHans Petter Selasky 				   IN const cl_list_item_t * const p_list_item,
1393*d6b92ffaSHans Petter Selasky 				   IN cl_pfn_qlist_find_t pfn_func,
1394*d6b92ffaSHans Petter Selasky 				   IN const void *const context);
1395*d6b92ffaSHans Petter Selasky /*
1396*d6b92ffaSHans Petter Selasky * PARAMETERS
1397*d6b92ffaSHans Petter Selasky *	p_list
1398*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure in which to search.
1399*d6b92ffaSHans Petter Selasky *
1400*d6b92ffaSHans Petter Selasky *	p_list_item
1401*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_list_item_t structure from which to start the search.
1402*d6b92ffaSHans Petter Selasky *
1403*d6b92ffaSHans Petter Selasky *	pfn_func
1404*d6b92ffaSHans Petter Selasky *		[in] Function invoked to determine if a match was found.
1405*d6b92ffaSHans Petter Selasky *		See the cl_pfn_qlist_find_t function type declaration for details
1406*d6b92ffaSHans Petter Selasky *		about the callback function.
1407*d6b92ffaSHans Petter Selasky *
1408*d6b92ffaSHans Petter Selasky *	context
1409*d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback functions to provide context if a
1410*d6b92ffaSHans Petter Selasky *		callback function is provided, or value compared to the quick list's
1411*d6b92ffaSHans Petter Selasky *		list items.
1412*d6b92ffaSHans Petter Selasky *
1413*d6b92ffaSHans Petter Selasky * Returns:
1414*d6b92ffaSHans Petter Selasky *	Pointer to the list item, if found.
1415*d6b92ffaSHans Petter Selasky *
1416*d6b92ffaSHans Petter Selasky *	p_list_item if not found.
1417*d6b92ffaSHans Petter Selasky *
1418*d6b92ffaSHans Petter Selasky * NOTES
1419*d6b92ffaSHans Petter Selasky *	cl_qlist_find_next does not remove list items from the list.
1420*d6b92ffaSHans Petter Selasky *	The list item is returned when the function specified by the pfn_func
1421*d6b92ffaSHans Petter Selasky *	parameter returns CL_SUCCESS.  The list item from which the search starts is
1422*d6b92ffaSHans Petter Selasky *	excluded from the search.
1423*d6b92ffaSHans Petter Selasky *
1424*d6b92ffaSHans Petter Selasky *	The function provided by the pfn_func must not perform any list operations,
1425*d6b92ffaSHans Petter Selasky *	as these would corrupt the list.
1426*d6b92ffaSHans Petter Selasky *
1427*d6b92ffaSHans Petter Selasky * SEE ALSO
1428*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_find_prev, cl_qlist_find_from_head,
1429*d6b92ffaSHans Petter Selasky *	cl_qlist_find_from_tail, cl_qlist_end, cl_qlist_apply_func,
1430*d6b92ffaSHans Petter Selasky *	cl_qlist_move_items, cl_list_item_t, cl_pfn_qlist_find_t
1431*d6b92ffaSHans Petter Selasky *********/
1432*d6b92ffaSHans Petter Selasky 
1433*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_find_prev
1434*d6b92ffaSHans Petter Selasky * NAME
1435*d6b92ffaSHans Petter Selasky *	cl_qlist_find_prev
1436*d6b92ffaSHans Petter Selasky *
1437*d6b92ffaSHans Petter Selasky * DESCRIPTION
1438*d6b92ffaSHans Petter Selasky *	The cl_qlist_find_prev function invokes a specified function to
1439*d6b92ffaSHans Petter Selasky *	search backward for an item, starting from a given list item.
1440*d6b92ffaSHans Petter Selasky *
1441*d6b92ffaSHans Petter Selasky * SYNOPSIS
1442*d6b92ffaSHans Petter Selasky */
1443*d6b92ffaSHans Petter Selasky cl_list_item_t *cl_qlist_find_prev(IN const cl_qlist_t * const p_list,
1444*d6b92ffaSHans Petter Selasky 				   IN const cl_list_item_t * const p_list_item,
1445*d6b92ffaSHans Petter Selasky 				   IN cl_pfn_qlist_find_t pfn_func,
1446*d6b92ffaSHans Petter Selasky 				   IN const void *const context);
1447*d6b92ffaSHans Petter Selasky /*
1448*d6b92ffaSHans Petter Selasky * PARAMETERS
1449*d6b92ffaSHans Petter Selasky *	p_list
1450*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure in which to search.
1451*d6b92ffaSHans Petter Selasky *
1452*d6b92ffaSHans Petter Selasky *	p_list_item
1453*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_list_item_t structure from which to start the search.
1454*d6b92ffaSHans Petter Selasky *
1455*d6b92ffaSHans Petter Selasky *	pfn_func
1456*d6b92ffaSHans Petter Selasky *		[in] Function invoked to determine if a match was found.
1457*d6b92ffaSHans Petter Selasky *		See the cl_pfn_qlist_find_t function type declaration for details
1458*d6b92ffaSHans Petter Selasky *		about the callback function.
1459*d6b92ffaSHans Petter Selasky *
1460*d6b92ffaSHans Petter Selasky *	context
1461*d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback functions to provide context if a
1462*d6b92ffaSHans Petter Selasky *		callback function is provided, or value compared to the quick list's
1463*d6b92ffaSHans Petter Selasky *		list items.
1464*d6b92ffaSHans Petter Selasky *
1465*d6b92ffaSHans Petter Selasky * Returns:
1466*d6b92ffaSHans Petter Selasky *	Pointer to the list item, if found.
1467*d6b92ffaSHans Petter Selasky *
1468*d6b92ffaSHans Petter Selasky *	p_list_item if not found.
1469*d6b92ffaSHans Petter Selasky *
1470*d6b92ffaSHans Petter Selasky * NOTES
1471*d6b92ffaSHans Petter Selasky *	cl_qlist_find_prev does not remove list items from the list.
1472*d6b92ffaSHans Petter Selasky *	The list item is returned when the function specified by the pfn_func
1473*d6b92ffaSHans Petter Selasky *	parameter returns CL_SUCCESS.  The list item from which the search starts is
1474*d6b92ffaSHans Petter Selasky *	excluded from the search.
1475*d6b92ffaSHans Petter Selasky *
1476*d6b92ffaSHans Petter Selasky *	The function provided by the pfn_func must not perform any list operations,
1477*d6b92ffaSHans Petter Selasky *	as these would corrupt the list.
1478*d6b92ffaSHans Petter Selasky *
1479*d6b92ffaSHans Petter Selasky * SEE ALSO
1480*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_find_next, cl_qlist_find_from_head,
1481*d6b92ffaSHans Petter Selasky *	cl_qlist_find_from_tail, cl_qlist_end, cl_qlist_apply_func,
1482*d6b92ffaSHans Petter Selasky *	cl_qlist_move_items, cl_list_item_t, cl_pfn_qlist_find_t
1483*d6b92ffaSHans Petter Selasky *********/
1484*d6b92ffaSHans Petter Selasky 
1485*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_find_from_head
1486*d6b92ffaSHans Petter Selasky * NAME
1487*d6b92ffaSHans Petter Selasky *	cl_qlist_find_from_head
1488*d6b92ffaSHans Petter Selasky *
1489*d6b92ffaSHans Petter Selasky * DESCRIPTION
1490*d6b92ffaSHans Petter Selasky *	The cl_qlist_find_from_head function invokes a specified function to
1491*d6b92ffaSHans Petter Selasky *	search for an item, starting at the head of a quick list.
1492*d6b92ffaSHans Petter Selasky *
1493*d6b92ffaSHans Petter Selasky * SYNOPSIS
1494*d6b92ffaSHans Petter Selasky */
cl_qlist_find_from_head(IN const cl_qlist_t * const p_list,IN cl_pfn_qlist_find_t pfn_func,IN const void * const context)1495*d6b92ffaSHans Petter Selasky static inline cl_list_item_t *cl_qlist_find_from_head(IN const cl_qlist_t *
1496*d6b92ffaSHans Petter Selasky 						      const p_list,
1497*d6b92ffaSHans Petter Selasky 						      IN cl_pfn_qlist_find_t
1498*d6b92ffaSHans Petter Selasky 						      pfn_func,
1499*d6b92ffaSHans Petter Selasky 						      IN const void *const
1500*d6b92ffaSHans Petter Selasky 						      context)
1501*d6b92ffaSHans Petter Selasky {
1502*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
1503*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
1504*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
1505*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list->state == CL_INITIALIZED);
1506*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a find function is provided. */
1507*d6b92ffaSHans Petter Selasky 	CL_ASSERT(pfn_func);
1508*d6b92ffaSHans Petter Selasky 
1509*d6b92ffaSHans Petter Selasky 	return (cl_qlist_find_next(p_list, cl_qlist_end(p_list), pfn_func,
1510*d6b92ffaSHans Petter Selasky 				   context));
1511*d6b92ffaSHans Petter Selasky }
1512*d6b92ffaSHans Petter Selasky 
1513*d6b92ffaSHans Petter Selasky /*
1514*d6b92ffaSHans Petter Selasky * PARAMETERS
1515*d6b92ffaSHans Petter Selasky *	p_list
1516*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure.
1517*d6b92ffaSHans Petter Selasky *
1518*d6b92ffaSHans Petter Selasky *	pfn_func
1519*d6b92ffaSHans Petter Selasky *		[in] Function invoked to determine if a match was found.
1520*d6b92ffaSHans Petter Selasky *		See the cl_pfn_qlist_find_t function type declaration for details
1521*d6b92ffaSHans Petter Selasky *		about the callback function.
1522*d6b92ffaSHans Petter Selasky *
1523*d6b92ffaSHans Petter Selasky *	context
1524*d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback functions to provide context if a
1525*d6b92ffaSHans Petter Selasky *		callback function is provided, or value compared to the quick list's
1526*d6b92ffaSHans Petter Selasky *		list items.
1527*d6b92ffaSHans Petter Selasky *
1528*d6b92ffaSHans Petter Selasky * Returns:
1529*d6b92ffaSHans Petter Selasky *	Pointer to the list item, if found.
1530*d6b92ffaSHans Petter Selasky *
1531*d6b92ffaSHans Petter Selasky *	Pointer to the list end otherwise
1532*d6b92ffaSHans Petter Selasky *
1533*d6b92ffaSHans Petter Selasky * NOTES
1534*d6b92ffaSHans Petter Selasky *	cl_qlist_find_from_head does not remove list items from the list.
1535*d6b92ffaSHans Petter Selasky *	The list item is returned when the function specified by the pfn_func
1536*d6b92ffaSHans Petter Selasky *	parameter returns CL_SUCCESS.
1537*d6b92ffaSHans Petter Selasky *
1538*d6b92ffaSHans Petter Selasky *	The function provided by the pfn_func parameter must not perform any list
1539*d6b92ffaSHans Petter Selasky *	operations, as these would corrupt the list.
1540*d6b92ffaSHans Petter Selasky *
1541*d6b92ffaSHans Petter Selasky * SEE ALSO
1542*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_find_from_tail, cl_qlist_find_next, cl_qlist_find_prev,
1543*d6b92ffaSHans Petter Selasky *	cl_qlist_end, cl_qlist_apply_func, cl_qlist_move_items, cl_list_item_t,
1544*d6b92ffaSHans Petter Selasky *	cl_pfn_qlist_find_t
1545*d6b92ffaSHans Petter Selasky *********/
1546*d6b92ffaSHans Petter Selasky 
1547*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_find_from_tail
1548*d6b92ffaSHans Petter Selasky * NAME
1549*d6b92ffaSHans Petter Selasky *	cl_qlist_find_from_tail
1550*d6b92ffaSHans Petter Selasky *
1551*d6b92ffaSHans Petter Selasky * DESCRIPTION
1552*d6b92ffaSHans Petter Selasky *	The cl_qlist_find_from_tail function invokes a specified function to
1553*d6b92ffaSHans Petter Selasky *	search for an item, starting at the tail of a quick list.
1554*d6b92ffaSHans Petter Selasky *
1555*d6b92ffaSHans Petter Selasky * SYNOPSIS
1556*d6b92ffaSHans Petter Selasky */
cl_qlist_find_from_tail(IN const cl_qlist_t * const p_list,IN cl_pfn_qlist_find_t pfn_func,IN const void * const context)1557*d6b92ffaSHans Petter Selasky static inline cl_list_item_t *cl_qlist_find_from_tail(IN const cl_qlist_t *
1558*d6b92ffaSHans Petter Selasky 						      const p_list,
1559*d6b92ffaSHans Petter Selasky 						      IN cl_pfn_qlist_find_t
1560*d6b92ffaSHans Petter Selasky 						      pfn_func,
1561*d6b92ffaSHans Petter Selasky 						      IN const void *const
1562*d6b92ffaSHans Petter Selasky 						      context)
1563*d6b92ffaSHans Petter Selasky {
1564*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
1565*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
1566*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the list was initialized. */
1567*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list->state == CL_INITIALIZED);
1568*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a find function is provided. */
1569*d6b92ffaSHans Petter Selasky 	CL_ASSERT(pfn_func);
1570*d6b92ffaSHans Petter Selasky 
1571*d6b92ffaSHans Petter Selasky 	return (cl_qlist_find_prev(p_list, cl_qlist_end(p_list), pfn_func,
1572*d6b92ffaSHans Petter Selasky 				   context));
1573*d6b92ffaSHans Petter Selasky }
1574*d6b92ffaSHans Petter Selasky 
1575*d6b92ffaSHans Petter Selasky /*
1576*d6b92ffaSHans Petter Selasky * PARAMETERS
1577*d6b92ffaSHans Petter Selasky *	p_list
1578*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure.
1579*d6b92ffaSHans Petter Selasky *
1580*d6b92ffaSHans Petter Selasky *	pfn_func
1581*d6b92ffaSHans Petter Selasky *		[in] Function invoked to determine if a match was found.
1582*d6b92ffaSHans Petter Selasky *		See the cl_pfn_qlist_find_t function type declaration for details
1583*d6b92ffaSHans Petter Selasky *		about the callback function.
1584*d6b92ffaSHans Petter Selasky *
1585*d6b92ffaSHans Petter Selasky *	context
1586*d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback functions to provide context if a
1587*d6b92ffaSHans Petter Selasky *		callback function is provided, or value compared to the quick list's
1588*d6b92ffaSHans Petter Selasky *		list items.
1589*d6b92ffaSHans Petter Selasky *
1590*d6b92ffaSHans Petter Selasky * Returns:
1591*d6b92ffaSHans Petter Selasky *	Pointer to the list item, if found.
1592*d6b92ffaSHans Petter Selasky *
1593*d6b92ffaSHans Petter Selasky *	Pointer to the list end otherwise
1594*d6b92ffaSHans Petter Selasky *
1595*d6b92ffaSHans Petter Selasky * NOTES
1596*d6b92ffaSHans Petter Selasky *	cl_qlist_find_from_tail does not remove list items from the list.
1597*d6b92ffaSHans Petter Selasky *	The list item is returned when the function specified by the pfn_func
1598*d6b92ffaSHans Petter Selasky *	parameter returns CL_SUCCESS.
1599*d6b92ffaSHans Petter Selasky *
1600*d6b92ffaSHans Petter Selasky *	The function provided by the pfn_func parameter must not perform any list
1601*d6b92ffaSHans Petter Selasky *	operations, as these would corrupt the list.
1602*d6b92ffaSHans Petter Selasky *
1603*d6b92ffaSHans Petter Selasky * SEE ALSO
1604*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_find_from_head, cl_qlist_find_next, cl_qlist_find_prev,
1605*d6b92ffaSHans Petter Selasky *	cl_qlist_apply_func, cl_qlist_end, cl_qlist_move_items, cl_list_item_t,
1606*d6b92ffaSHans Petter Selasky *	cl_pfn_qlist_find_t
1607*d6b92ffaSHans Petter Selasky *********/
1608*d6b92ffaSHans Petter Selasky 
1609*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_apply_func
1610*d6b92ffaSHans Petter Selasky * NAME
1611*d6b92ffaSHans Petter Selasky *	cl_qlist_apply_func
1612*d6b92ffaSHans Petter Selasky *
1613*d6b92ffaSHans Petter Selasky * DESCRIPTION
1614*d6b92ffaSHans Petter Selasky *	The cl_qlist_apply_func function executes a specified function
1615*d6b92ffaSHans Petter Selasky *	for every list item stored in a quick list.
1616*d6b92ffaSHans Petter Selasky *
1617*d6b92ffaSHans Petter Selasky * SYNOPSIS
1618*d6b92ffaSHans Petter Selasky */
1619*d6b92ffaSHans Petter Selasky void
1620*d6b92ffaSHans Petter Selasky cl_qlist_apply_func(IN const cl_qlist_t * const p_list,
1621*d6b92ffaSHans Petter Selasky 		    IN cl_pfn_qlist_apply_t pfn_func,
1622*d6b92ffaSHans Petter Selasky 		    IN const void *const context);
1623*d6b92ffaSHans Petter Selasky /*
1624*d6b92ffaSHans Petter Selasky * PARAMETERS
1625*d6b92ffaSHans Petter Selasky *	p_list
1626*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure.
1627*d6b92ffaSHans Petter Selasky *
1628*d6b92ffaSHans Petter Selasky *	pfn_func
1629*d6b92ffaSHans Petter Selasky *		[in] Function invoked for every item in the quick list.
1630*d6b92ffaSHans Petter Selasky *		See the cl_pfn_qlist_apply_t function type declaration for details
1631*d6b92ffaSHans Petter Selasky *		about the callback function.
1632*d6b92ffaSHans Petter Selasky *
1633*d6b92ffaSHans Petter Selasky *	context
1634*d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback functions to provide context.
1635*d6b92ffaSHans Petter Selasky *
1636*d6b92ffaSHans Petter Selasky * RETURN VALUE
1637*d6b92ffaSHans Petter Selasky *	This function does not return a value.
1638*d6b92ffaSHans Petter Selasky *
1639*d6b92ffaSHans Petter Selasky * NOTES
1640*d6b92ffaSHans Petter Selasky *	The function provided must not perform any list operations, as these
1641*d6b92ffaSHans Petter Selasky *	would corrupt the quick list.
1642*d6b92ffaSHans Petter Selasky *
1643*d6b92ffaSHans Petter Selasky * SEE ALSO
1644*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_find_from_head, cl_qlist_find_from_tail,
1645*d6b92ffaSHans Petter Selasky *	cl_qlist_move_items, cl_pfn_qlist_apply_t
1646*d6b92ffaSHans Petter Selasky *********/
1647*d6b92ffaSHans Petter Selasky 
1648*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick List/cl_qlist_move_items
1649*d6b92ffaSHans Petter Selasky * NAME
1650*d6b92ffaSHans Petter Selasky *	cl_qlist_move_items
1651*d6b92ffaSHans Petter Selasky *
1652*d6b92ffaSHans Petter Selasky * DESCRIPTION
1653*d6b92ffaSHans Petter Selasky *	The cl_qlist_move_items function moves list items from one list to
1654*d6b92ffaSHans Petter Selasky *	another based on the return value of a user supplied function.
1655*d6b92ffaSHans Petter Selasky *
1656*d6b92ffaSHans Petter Selasky * SYNOPSIS
1657*d6b92ffaSHans Petter Selasky */
1658*d6b92ffaSHans Petter Selasky void
1659*d6b92ffaSHans Petter Selasky cl_qlist_move_items(IN cl_qlist_t * const p_src_list,
1660*d6b92ffaSHans Petter Selasky 		    IN cl_qlist_t * const p_dest_list,
1661*d6b92ffaSHans Petter Selasky 		    IN cl_pfn_qlist_find_t pfn_func,
1662*d6b92ffaSHans Petter Selasky 		    IN const void *const context);
1663*d6b92ffaSHans Petter Selasky /*
1664*d6b92ffaSHans Petter Selasky * PARAMETERS
1665*d6b92ffaSHans Petter Selasky *	p_src_list
1666*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure from which
1667*d6b92ffaSHans Petter Selasky *		list items are removed.
1668*d6b92ffaSHans Petter Selasky *
1669*d6b92ffaSHans Petter Selasky *	p_dest_list
1670*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure to which the source
1671*d6b92ffaSHans Petter Selasky *		list items are added.
1672*d6b92ffaSHans Petter Selasky *
1673*d6b92ffaSHans Petter Selasky *	pfn_func
1674*d6b92ffaSHans Petter Selasky *		[in] Function invoked to determine if a match was found.
1675*d6b92ffaSHans Petter Selasky *		See the cl_pfn_qlist_find_t function type declaration for details
1676*d6b92ffaSHans Petter Selasky *		about the callback function.
1677*d6b92ffaSHans Petter Selasky *
1678*d6b92ffaSHans Petter Selasky *	context
1679*d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback functions to provide context.
1680*d6b92ffaSHans Petter Selasky *
1681*d6b92ffaSHans Petter Selasky * RETURN VALUE
1682*d6b92ffaSHans Petter Selasky *	This function does not return a value.
1683*d6b92ffaSHans Petter Selasky *
1684*d6b92ffaSHans Petter Selasky * NOTES
1685*d6b92ffaSHans Petter Selasky *	If the function specified by the pfn_func parameter returns CL_SUCCESS,
1686*d6b92ffaSHans Petter Selasky *	the related list item is removed from p_src_list and inserted at the tail
1687*d6b92ffaSHans Petter Selasky *	of the p_dest_list.
1688*d6b92ffaSHans Petter Selasky *
1689*d6b92ffaSHans Petter Selasky *	The cl_qlist_move_items function continues iterating through p_src_list
1690*d6b92ffaSHans Petter Selasky *	from the last item moved, allowing multiple items to be located and moved
1691*d6b92ffaSHans Petter Selasky *	in a single list iteration.
1692*d6b92ffaSHans Petter Selasky *
1693*d6b92ffaSHans Petter Selasky *	The function specified by pfn_func must not perform any list operations,
1694*d6b92ffaSHans Petter Selasky *	as these would corrupt the list.
1695*d6b92ffaSHans Petter Selasky *
1696*d6b92ffaSHans Petter Selasky * SEE ALSO
1697*d6b92ffaSHans Petter Selasky *	Quick List, cl_qlist_find_from_head, cl_qlist_find_from_tail,
1698*d6b92ffaSHans Petter Selasky *	cl_qlist_apply_func, cl_pfn_qlist_find_t
1699*d6b92ffaSHans Petter Selasky *********/
1700*d6b92ffaSHans Petter Selasky 
1701*d6b92ffaSHans Petter Selasky END_C_DECLS
1702*d6b92ffaSHans Petter Selasky #endif				/* _CL_QUICK_LIST_H_ */
1703