1d6b92ffaSHans Petter Selasky /*
2d6b92ffaSHans Petter Selasky  * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved.
3d6b92ffaSHans Petter Selasky  * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
4d6b92ffaSHans Petter Selasky  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5d6b92ffaSHans Petter Selasky  *
6d6b92ffaSHans Petter Selasky  * This software is available to you under a choice of one of two
7d6b92ffaSHans Petter Selasky  * licenses.  You may choose to be licensed under the terms of the GNU
8d6b92ffaSHans Petter Selasky  * General Public License (GPL) Version 2, available from the file
9d6b92ffaSHans Petter Selasky  * COPYING in the main directory of this source tree, or the
10d6b92ffaSHans Petter Selasky  * OpenIB.org BSD license below:
11d6b92ffaSHans Petter Selasky  *
12d6b92ffaSHans Petter Selasky  *     Redistribution and use in source and binary forms, with or
13d6b92ffaSHans Petter Selasky  *     without modification, are permitted provided that the following
14d6b92ffaSHans Petter Selasky  *     conditions are met:
15d6b92ffaSHans Petter Selasky  *
16d6b92ffaSHans Petter Selasky  *      - Redistributions of source code must retain the above
17d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
18d6b92ffaSHans Petter Selasky  *        disclaimer.
19d6b92ffaSHans Petter Selasky  *
20d6b92ffaSHans Petter Selasky  *      - Redistributions in binary form must reproduce the above
21d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
22d6b92ffaSHans Petter Selasky  *        disclaimer in the documentation and/or other materials
23d6b92ffaSHans Petter Selasky  *        provided with the distribution.
24d6b92ffaSHans Petter Selasky  *
25d6b92ffaSHans Petter Selasky  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26d6b92ffaSHans Petter Selasky  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27d6b92ffaSHans Petter Selasky  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28d6b92ffaSHans Petter Selasky  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29d6b92ffaSHans Petter Selasky  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30d6b92ffaSHans Petter Selasky  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31d6b92ffaSHans Petter Selasky  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32d6b92ffaSHans Petter Selasky  * SOFTWARE.
33d6b92ffaSHans Petter Selasky  *
34d6b92ffaSHans Petter Selasky  */
35d6b92ffaSHans Petter Selasky 
36d6b92ffaSHans Petter Selasky /*
37d6b92ffaSHans Petter Selasky  * Abstract:
38d6b92ffaSHans Petter Selasky  *	Declaration of the quick composite pool.  The quick composite pool
39d6b92ffaSHans Petter Selasky  *	manages a pool of composite objects.  A composite object is an object
40d6b92ffaSHans Petter Selasky  *	that is made of multiple sub objects.
41d6b92ffaSHans Petter Selasky  *	It can grow to meet demand, limited only by system memory.
42d6b92ffaSHans Petter Selasky  */
43d6b92ffaSHans Petter Selasky 
44d6b92ffaSHans Petter Selasky #ifndef _CL_QUICK_COMPOSITE_POOL_H_
45d6b92ffaSHans Petter Selasky #define _CL_QUICK_COMPOSITE_POOL_H_
46d6b92ffaSHans Petter Selasky 
47d6b92ffaSHans Petter Selasky #include <complib/cl_types.h>
48d6b92ffaSHans Petter Selasky #include <complib/cl_qlist.h>
49d6b92ffaSHans Petter Selasky 
50d6b92ffaSHans Petter Selasky #ifdef __cplusplus
51d6b92ffaSHans Petter Selasky #  define BEGIN_C_DECLS extern "C" {
52d6b92ffaSHans Petter Selasky #  define END_C_DECLS   }
53d6b92ffaSHans Petter Selasky #else				/* !__cplusplus */
54d6b92ffaSHans Petter Selasky #  define BEGIN_C_DECLS
55d6b92ffaSHans Petter Selasky #  define END_C_DECLS
56d6b92ffaSHans Petter Selasky #endif				/* __cplusplus */
57d6b92ffaSHans Petter Selasky 
58d6b92ffaSHans Petter Selasky BEGIN_C_DECLS
59d6b92ffaSHans Petter Selasky /****h* Component Library/Quick Composite Pool
60d6b92ffaSHans Petter Selasky * NAME
61d6b92ffaSHans Petter Selasky *	Quick Composite Pool
62d6b92ffaSHans Petter Selasky *
63d6b92ffaSHans Petter Selasky * DESCRIPTION
64d6b92ffaSHans Petter Selasky *	The Quick Composite Pool provides a self-contained and self-sustaining
65d6b92ffaSHans Petter Selasky *	pool of user defined composite objects.
66d6b92ffaSHans Petter Selasky *
67d6b92ffaSHans Petter Selasky *	A composite object is an object that is composed of one or more
68d6b92ffaSHans Petter Selasky *	sub-objects, each of which needs to be treated separately for
69d6b92ffaSHans Petter Selasky *	initialization. Objects can be retrieved from the pool as long as there
70d6b92ffaSHans Petter Selasky *	is memory in the system.
71d6b92ffaSHans Petter Selasky *
72d6b92ffaSHans Petter Selasky *	To aid in object oriented design, the Quick Composite Pool provides users
73d6b92ffaSHans Petter Selasky *	the ability to specify callbacks that are invoked for each object for
74d6b92ffaSHans Petter Selasky *	construction, initialization, and destruction. Constructor and destructor
75d6b92ffaSHans Petter Selasky *	callback functions may not fail.
76d6b92ffaSHans Petter Selasky *
77d6b92ffaSHans Petter Selasky *	A Quick Composite Pool does not return memory to the system as the user
78d6b92ffaSHans Petter Selasky *	returns objects to the pool. The only method of returning memory to the
79d6b92ffaSHans Petter Selasky *	system is to destroy the pool.
80d6b92ffaSHans Petter Selasky *
81d6b92ffaSHans Petter Selasky *	The Quick Composite Pool operates on cl_pool_item_t structures that
82d6b92ffaSHans Petter Selasky *	describe composite objects. This provides for more efficient memory use.
83d6b92ffaSHans Petter Selasky *	If using a cl_pool_item_t is not desired, the Composite Pool provides
84d6b92ffaSHans Petter Selasky *	similar functionality but operates on opaque objects.
85d6b92ffaSHans Petter Selasky *
86d6b92ffaSHans Petter Selasky *	The Quick Composit Pool functions operate on a cl_qcpool_t structure
87d6b92ffaSHans Petter Selasky *	which should be treated as opaque and should be manipulated only through
88d6b92ffaSHans Petter Selasky *	the provided functions.
89d6b92ffaSHans Petter Selasky *
90d6b92ffaSHans Petter Selasky * SEE ALSO
91d6b92ffaSHans Petter Selasky *	Structures:
92d6b92ffaSHans Petter Selasky *		cl_qcpool_t, cl_pool_item_t
93d6b92ffaSHans Petter Selasky *
94d6b92ffaSHans Petter Selasky *	Callbacks:
95d6b92ffaSHans Petter Selasky *		cl_pfn_qcpool_init_t, cl_pfn_qcpool_dtor_t
96d6b92ffaSHans Petter Selasky *
97d6b92ffaSHans Petter Selasky *	Initialization/Destruction:
98d6b92ffaSHans Petter Selasky *		cl_qcpool_construct, cl_qcpool_init, cl_qcpool_destroy
99d6b92ffaSHans Petter Selasky *
100d6b92ffaSHans Petter Selasky *	Manipulation:
101d6b92ffaSHans Petter Selasky *		cl_qcpool_get, cl_qcpool_put, cl_qcpool_put_list, cl_qcpool_grow
102d6b92ffaSHans Petter Selasky *
103d6b92ffaSHans Petter Selasky *	Attributes:
104d6b92ffaSHans Petter Selasky *		cl_is_qcpool_inited, cl_qcpool_count
105d6b92ffaSHans Petter Selasky *********/
106d6b92ffaSHans Petter Selasky /****s* Component Library: Quick Composite Pool/cl_pool_item_t
107d6b92ffaSHans Petter Selasky * NAME
108d6b92ffaSHans Petter Selasky *	cl_pool_item_t
109d6b92ffaSHans Petter Selasky *
110d6b92ffaSHans Petter Selasky * DESCRIPTION
111d6b92ffaSHans Petter Selasky *	The cl_pool_item_t structure is used by pools to store objects.
112d6b92ffaSHans Petter Selasky *
113d6b92ffaSHans Petter Selasky * SYNOPSIS
114d6b92ffaSHans Petter Selasky */
115d6b92ffaSHans Petter Selasky typedef struct _cl_pool_item {
116d6b92ffaSHans Petter Selasky 	cl_list_item_t list_item;
117d6b92ffaSHans Petter Selasky #ifdef _DEBUG_
118d6b92ffaSHans Petter Selasky 	/* Pointer to the owner pool used for sanity checks. */
119d6b92ffaSHans Petter Selasky 	struct _cl_qcpool *p_pool;
120d6b92ffaSHans Petter Selasky #endif
121d6b92ffaSHans Petter Selasky } cl_pool_item_t;
122d6b92ffaSHans Petter Selasky /*
123d6b92ffaSHans Petter Selasky * FIELDS
124d6b92ffaSHans Petter Selasky *	list_item
125d6b92ffaSHans Petter Selasky *		Used internally by the pool. Users should not use this field.
126d6b92ffaSHans Petter Selasky *
127d6b92ffaSHans Petter Selasky *	p_pool
128d6b92ffaSHans Petter Selasky *		Used internally by the pool in debug builds to check for consistency.
129d6b92ffaSHans Petter Selasky *
130d6b92ffaSHans Petter Selasky * NOTES
131d6b92ffaSHans Petter Selasky *	The pool item structure is defined in such a way as to safely allow
132d6b92ffaSHans Petter Selasky *	users to cast from a pool item to a list item for storing items
133d6b92ffaSHans Petter Selasky *	retrieved from a quick pool in a quick list.
134d6b92ffaSHans Petter Selasky *
135d6b92ffaSHans Petter Selasky * SEE ALSO
136d6b92ffaSHans Petter Selasky *	Quick Composite Pool, cl_list_item_t
137d6b92ffaSHans Petter Selasky *********/
138d6b92ffaSHans Petter Selasky 
139d6b92ffaSHans Petter Selasky /****i* Component Library: Quick List/cl_pool_obj_t
140d6b92ffaSHans Petter Selasky * NAME
141d6b92ffaSHans Petter Selasky *	cl_pool_obj_t
142d6b92ffaSHans Petter Selasky *
143d6b92ffaSHans Petter Selasky * DESCRIPTION
144d6b92ffaSHans Petter Selasky *	The cl_pool_obj_t structure is used by pools to store objects.
145d6b92ffaSHans Petter Selasky *
146d6b92ffaSHans Petter Selasky * SYNOPSIS
147d6b92ffaSHans Petter Selasky */
148d6b92ffaSHans Petter Selasky typedef struct _cl_pool_obj {
149d6b92ffaSHans Petter Selasky 	/* The pool item must be the first item to allow casting. */
150d6b92ffaSHans Petter Selasky 	cl_pool_item_t pool_item;
151d6b92ffaSHans Petter Selasky 	const void *p_object;
152d6b92ffaSHans Petter Selasky } cl_pool_obj_t;
153d6b92ffaSHans Petter Selasky /*
154d6b92ffaSHans Petter Selasky * FIELDS
155d6b92ffaSHans Petter Selasky *	pool_item
156d6b92ffaSHans Petter Selasky *		Used internally by the pool. Users should not use this field.
157d6b92ffaSHans Petter Selasky *
158d6b92ffaSHans Petter Selasky *	p_object
159d6b92ffaSHans Petter Selasky *		Pointer to the user's object being stored in the pool.
160d6b92ffaSHans Petter Selasky *
161d6b92ffaSHans Petter Selasky * NOTES
162d6b92ffaSHans Petter Selasky *	The pool object structure is used by non-quick pools to store object.
163d6b92ffaSHans Petter Selasky *
164d6b92ffaSHans Petter Selasky * SEE ALSO
165d6b92ffaSHans Petter Selasky *	cl_pool_item_t
166d6b92ffaSHans Petter Selasky *********/
167d6b92ffaSHans Petter Selasky 
168d6b92ffaSHans Petter Selasky /****d* Component Library: Quick Composite Pool/cl_pfn_qcpool_init_t
169d6b92ffaSHans Petter Selasky * NAME
170d6b92ffaSHans Petter Selasky *	cl_pfn_qcpool_init_t
171d6b92ffaSHans Petter Selasky *
172d6b92ffaSHans Petter Selasky * DESCRIPTION
173d6b92ffaSHans Petter Selasky *	The cl_pfn_qcpool_init_t function type defines the prototype for
174d6b92ffaSHans Petter Selasky *	functions used as initializer for objects being allocated by a
175d6b92ffaSHans Petter Selasky *	quick composite pool.
176d6b92ffaSHans Petter Selasky *
177d6b92ffaSHans Petter Selasky * SYNOPSIS
178d6b92ffaSHans Petter Selasky */
179d6b92ffaSHans Petter Selasky typedef cl_status_t
180d6b92ffaSHans Petter Selasky     (*cl_pfn_qcpool_init_t) (IN void **const p_comp_array,
181d6b92ffaSHans Petter Selasky 			     IN const uint32_t num_components,
182d6b92ffaSHans Petter Selasky 			     IN void *context,
183d6b92ffaSHans Petter Selasky 			     OUT cl_pool_item_t ** const pp_pool_item);
184d6b92ffaSHans Petter Selasky /*
185d6b92ffaSHans Petter Selasky * PARAMETERS
186d6b92ffaSHans Petter Selasky *	p_comp_array
187d6b92ffaSHans Petter Selasky *		[in] Pointer to the first entry in an array of pointers, each of
188d6b92ffaSHans Petter Selasky *		which points to a component that makes up a composite object.
189d6b92ffaSHans Petter Selasky *
190d6b92ffaSHans Petter Selasky *	num_components
191d6b92ffaSHans Petter Selasky *		[in] Number of components that in the component array.
192d6b92ffaSHans Petter Selasky *
193d6b92ffaSHans Petter Selasky *	context
194d6b92ffaSHans Petter Selasky *		[in] Context provided in a call to cl_qcpool_init.
195d6b92ffaSHans Petter Selasky *
196d6b92ffaSHans Petter Selasky *	pp_pool_item
197d6b92ffaSHans Petter Selasky *		[out] Users should set this pointer to reference the cl_pool_item_t
198d6b92ffaSHans Petter Selasky *		structure that represents the composite object.  This pointer must
199d6b92ffaSHans Petter Selasky *		not be NULL if the function returns CL_SUCCESS.
200d6b92ffaSHans Petter Selasky *
201d6b92ffaSHans Petter Selasky * RETURN VALUE
202d6b92ffaSHans Petter Selasky *	Return CL_SUCCESS to indicate that initialization of the object
203d6b92ffaSHans Petter Selasky *	was successful and that initialization of further objects may continue.
204d6b92ffaSHans Petter Selasky *
205d6b92ffaSHans Petter Selasky *	Other cl_status_t values will be returned by cl_qcpool_init
206d6b92ffaSHans Petter Selasky *	and cl_qcpool_grow.
207d6b92ffaSHans Petter Selasky *
208d6b92ffaSHans Petter Selasky * NOTES
209d6b92ffaSHans Petter Selasky *	This function type is provided as function prototype reference for
210d6b92ffaSHans Petter Selasky *	the function provided by the user as a parameter to the
211d6b92ffaSHans Petter Selasky *	cl_qcpool_init function.
212d6b92ffaSHans Petter Selasky *
213d6b92ffaSHans Petter Selasky *	The initializer is invoked once per allocated object, allowing the user
214d6b92ffaSHans Petter Selasky *	to chain components to form a composite object and perform any necessary
215d6b92ffaSHans Petter Selasky *	initialization.  Returning a status other than CL_SUCCESS aborts a grow
216d6b92ffaSHans Petter Selasky *	operation, initiated either through cl_qcpool_init or cl_qcpool_grow,
217d6b92ffaSHans Petter Selasky *	and causes the initiating function to fail.  Any non-CL_SUCCESS status
218d6b92ffaSHans Petter Selasky *	will be returned by the function that initiated the grow operation.
219d6b92ffaSHans Petter Selasky *
220d6b92ffaSHans Petter Selasky *	All memory for the requested number of components is pre-allocated.  Users
221d6b92ffaSHans Petter Selasky *	should include space in one of their components for the cl_pool_item_t
222d6b92ffaSHans Petter Selasky *	structure that will represent the composite object to avoid having to
223d6b92ffaSHans Petter Selasky *	allocate that structure in the initialization callback.  Alternatively,
224d6b92ffaSHans Petter Selasky *	users may specify an additional component for the cl_pool_item_t structure.
225d6b92ffaSHans Petter Selasky *
226d6b92ffaSHans Petter Selasky *	When later performing a cl_qcpool_get call, the return value is a pointer
227d6b92ffaSHans Petter Selasky *	to the cl_pool_item_t returned by this function in the pp_pool_item
228d6b92ffaSHans Petter Selasky *	parameter. Users must set pp_pool_item to a valid pointer to the
229d6b92ffaSHans Petter Selasky *	cl_pool_item_t representing the object if they return CL_SUCCESS.
230d6b92ffaSHans Petter Selasky *
231d6b92ffaSHans Petter Selasky * SEE ALSO
232d6b92ffaSHans Petter Selasky *	Quick Composite Pool, cl_qcpool_init
233d6b92ffaSHans Petter Selasky *********/
234d6b92ffaSHans Petter Selasky 
235d6b92ffaSHans Petter Selasky /****d* Component Library: Quick Composite Pool/cl_pfn_qcpool_dtor_t
236d6b92ffaSHans Petter Selasky * NAME
237d6b92ffaSHans Petter Selasky *	cl_pfn_qcpool_dtor_t
238d6b92ffaSHans Petter Selasky *
239d6b92ffaSHans Petter Selasky * DESCRIPTION
240d6b92ffaSHans Petter Selasky *	The cl_pfn_qcpool_dtor_t function type defines the prototype for
241d6b92ffaSHans Petter Selasky *	functions used as destructor for objects being deallocated by a
242d6b92ffaSHans Petter Selasky *	quick composite pool.
243d6b92ffaSHans Petter Selasky *
244d6b92ffaSHans Petter Selasky * SYNOPSIS
245d6b92ffaSHans Petter Selasky */
246d6b92ffaSHans Petter Selasky typedef void
247d6b92ffaSHans Petter Selasky  (*cl_pfn_qcpool_dtor_t) (IN const cl_pool_item_t * const p_pool_item,
248d6b92ffaSHans Petter Selasky 			  IN void *context);
249d6b92ffaSHans Petter Selasky /*
250d6b92ffaSHans Petter Selasky * PARAMETERS
251d6b92ffaSHans Petter Selasky *	p_pool_item
252d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_pool_item_t structure representing an object.
253d6b92ffaSHans Petter Selasky *
254d6b92ffaSHans Petter Selasky *	context
255d6b92ffaSHans Petter Selasky *		[in] Context provided in a call to cl_qcpool_init.
256d6b92ffaSHans Petter Selasky *
257d6b92ffaSHans Petter Selasky * RETURN VALUE
258d6b92ffaSHans Petter Selasky *	This function does not return a value.
259d6b92ffaSHans Petter Selasky *
260d6b92ffaSHans Petter Selasky * NOTES
261d6b92ffaSHans Petter Selasky *	This function type is provided as function prototype reference for
262d6b92ffaSHans Petter Selasky *	the function provided by the user as an optional parameter to the
263d6b92ffaSHans Petter Selasky *	cl_qcpool_init function.
264d6b92ffaSHans Petter Selasky *
265d6b92ffaSHans Petter Selasky *	The destructor is invoked once per allocated object, allowing the user
266d6b92ffaSHans Petter Selasky *	to perform any necessary cleanup. Users should not attempt to deallocate
267d6b92ffaSHans Petter Selasky *	the memory for the composite object, as the quick composite pool manages
268d6b92ffaSHans Petter Selasky *	object allocation and deallocation.
269d6b92ffaSHans Petter Selasky *
270d6b92ffaSHans Petter Selasky * SEE ALSO
271d6b92ffaSHans Petter Selasky *	Quick Composite Pool, cl_qcpool_init
272d6b92ffaSHans Petter Selasky *********/
273d6b92ffaSHans Petter Selasky 
274d6b92ffaSHans Petter Selasky /****s* Component Library: Quick Composite Pool/cl_qcpool_t
275d6b92ffaSHans Petter Selasky * NAME
276d6b92ffaSHans Petter Selasky *	cl_qcpool_t
277d6b92ffaSHans Petter Selasky *
278d6b92ffaSHans Petter Selasky * DESCRIPTION
279d6b92ffaSHans Petter Selasky *	Quick composite pool structure.
280d6b92ffaSHans Petter Selasky *
281d6b92ffaSHans Petter Selasky *	The cl_qcpool_t structure should be treated as opaque and should be
282d6b92ffaSHans Petter Selasky *	manipulated only through the provided functions.
283d6b92ffaSHans Petter Selasky *
284d6b92ffaSHans Petter Selasky * SYNOPSIS
285d6b92ffaSHans Petter Selasky */
286d6b92ffaSHans Petter Selasky typedef struct _cl_qcpool {
287d6b92ffaSHans Petter Selasky 	uint32_t num_components;
288d6b92ffaSHans Petter Selasky 	size_t *component_sizes;
289d6b92ffaSHans Petter Selasky 	void **p_components;
290d6b92ffaSHans Petter Selasky 	size_t num_objects;
291d6b92ffaSHans Petter Selasky 	size_t max_objects;
292d6b92ffaSHans Petter Selasky 	size_t grow_size;
293d6b92ffaSHans Petter Selasky 	cl_pfn_qcpool_init_t pfn_init;
294d6b92ffaSHans Petter Selasky 	cl_pfn_qcpool_dtor_t pfn_dtor;
295d6b92ffaSHans Petter Selasky 	const void *context;
296d6b92ffaSHans Petter Selasky 	cl_qlist_t free_list;
297d6b92ffaSHans Petter Selasky 	cl_qlist_t alloc_list;
298d6b92ffaSHans Petter Selasky 	cl_state_t state;
299d6b92ffaSHans Petter Selasky } cl_qcpool_t;
300d6b92ffaSHans Petter Selasky /*
301d6b92ffaSHans Petter Selasky * FIELDS
302d6b92ffaSHans Petter Selasky *	num_components
303d6b92ffaSHans Petter Selasky *		Number of components per object.
304d6b92ffaSHans Petter Selasky *
305d6b92ffaSHans Petter Selasky *	component_sizes
306d6b92ffaSHans Petter Selasky *		Array of sizes, one for each component.
307d6b92ffaSHans Petter Selasky *
308d6b92ffaSHans Petter Selasky *	p_components
309d6b92ffaSHans Petter Selasky *		Array of pointers to components, used for the constructor callback.
310d6b92ffaSHans Petter Selasky *
311d6b92ffaSHans Petter Selasky *	num_objects
312d6b92ffaSHans Petter Selasky *		Number of objects managed by the pool
313d6b92ffaSHans Petter Selasky *
314d6b92ffaSHans Petter Selasky *	grow_size
315d6b92ffaSHans Petter Selasky *		Number of objects to add when automatically growing the pool.
316d6b92ffaSHans Petter Selasky *
317d6b92ffaSHans Petter Selasky *	pfn_init
318d6b92ffaSHans Petter Selasky *		Pointer to the user's initializer callback to invoke when initializing
319d6b92ffaSHans Petter Selasky *		new objects.
320d6b92ffaSHans Petter Selasky *
321d6b92ffaSHans Petter Selasky *	pfn_dtor
322d6b92ffaSHans Petter Selasky *		Pointer to the user's destructor callback to invoke before deallocating
323d6b92ffaSHans Petter Selasky *		memory allocated for objects.
324d6b92ffaSHans Petter Selasky *
325d6b92ffaSHans Petter Selasky *	context
326d6b92ffaSHans Petter Selasky *		User's provided context for callback functions, used by the pool
327d6b92ffaSHans Petter Selasky *		when invoking callbacks.
328d6b92ffaSHans Petter Selasky *
329d6b92ffaSHans Petter Selasky *	free_list
330d6b92ffaSHans Petter Selasky *		Quick list of objects available.
331d6b92ffaSHans Petter Selasky *
332d6b92ffaSHans Petter Selasky *	alloc_list
333d6b92ffaSHans Petter Selasky *		Quick list used to store information about allocations.
334d6b92ffaSHans Petter Selasky *
335d6b92ffaSHans Petter Selasky *	state
336d6b92ffaSHans Petter Selasky *		State of the pool.
337d6b92ffaSHans Petter Selasky *
338d6b92ffaSHans Petter Selasky * SEE ALSO
339d6b92ffaSHans Petter Selasky *	Quick Composite Pool
340d6b92ffaSHans Petter Selasky *********/
341d6b92ffaSHans Petter Selasky 
342d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Composite Pool/cl_qcpool_construct
343d6b92ffaSHans Petter Selasky * NAME
344d6b92ffaSHans Petter Selasky *	cl_qcpool_construct
345d6b92ffaSHans Petter Selasky *
346d6b92ffaSHans Petter Selasky * DESCRIPTION
347d6b92ffaSHans Petter Selasky *	The cl_qcpool_construct function constructs a quick composite pool.
348d6b92ffaSHans Petter Selasky *
349d6b92ffaSHans Petter Selasky * SYNOPSIS
350d6b92ffaSHans Petter Selasky */
351d6b92ffaSHans Petter Selasky void cl_qcpool_construct(IN cl_qcpool_t * const p_pool);
352d6b92ffaSHans Petter Selasky /*
353d6b92ffaSHans Petter Selasky * PARAMETERS
354d6b92ffaSHans Petter Selasky *	p_pool
355d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qcpool_t structure whose state to initialize.
356d6b92ffaSHans Petter Selasky *
357d6b92ffaSHans Petter Selasky * RETURN VALUE
358d6b92ffaSHans Petter Selasky *	This function does not return a value.
359d6b92ffaSHans Petter Selasky *
360d6b92ffaSHans Petter Selasky * NOTES
361d6b92ffaSHans Petter Selasky *	Allows calling cl_qcpool_init, cl_qcpool_destroy, cl_is_qcpool_inited.
362d6b92ffaSHans Petter Selasky *
363d6b92ffaSHans Petter Selasky *	Calling cl_qcpool_construct is a prerequisite to calling any other
364d6b92ffaSHans Petter Selasky *	quick composite pool function except cl_qcpool_init.
365d6b92ffaSHans Petter Selasky *
366d6b92ffaSHans Petter Selasky * SEE ALSO
367d6b92ffaSHans Petter Selasky *	Quick Composite Pool, cl_qcpool_init, cl_qcpool_destroy,
368d6b92ffaSHans Petter Selasky *	cl_is_qcpool_inited
369d6b92ffaSHans Petter Selasky *********/
370d6b92ffaSHans Petter Selasky 
371d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Composite Pool/cl_is_qcpool_inited
372d6b92ffaSHans Petter Selasky * NAME
373d6b92ffaSHans Petter Selasky *	cl_is_qcpool_inited
374d6b92ffaSHans Petter Selasky *
375d6b92ffaSHans Petter Selasky * DESCRIPTION
376d6b92ffaSHans Petter Selasky *	The cl_is_qcpool_inited function returns whether a quick composite pool was
377d6b92ffaSHans Petter Selasky *	successfully initialized.
378d6b92ffaSHans Petter Selasky *
379d6b92ffaSHans Petter Selasky * SYNOPSIS
380d6b92ffaSHans Petter Selasky */
cl_is_qcpool_inited(IN const cl_qcpool_t * const p_pool)381d6b92ffaSHans Petter Selasky static inline uint32_t cl_is_qcpool_inited(IN const cl_qcpool_t * const p_pool)
382d6b92ffaSHans Petter Selasky {
383d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
384d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool);
385d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that the pool is not in some invalid state. */
386d6b92ffaSHans Petter Selasky 	CL_ASSERT(cl_is_state_valid(p_pool->state));
387d6b92ffaSHans Petter Selasky 
388d6b92ffaSHans Petter Selasky 	return (p_pool->state == CL_INITIALIZED);
389d6b92ffaSHans Petter Selasky }
390d6b92ffaSHans Petter Selasky 
391d6b92ffaSHans Petter Selasky /*
392d6b92ffaSHans Petter Selasky * PARAMETERS
393d6b92ffaSHans Petter Selasky *	p_pool
394d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qcpool_t structure to check.
395d6b92ffaSHans Petter Selasky *
396d6b92ffaSHans Petter Selasky * RETURN VALUES
397d6b92ffaSHans Petter Selasky *	TRUE if the quick composite pool was initialized successfully.
398d6b92ffaSHans Petter Selasky *
399d6b92ffaSHans Petter Selasky *	FALSE otherwise.
400d6b92ffaSHans Petter Selasky *
401d6b92ffaSHans Petter Selasky * NOTES
402d6b92ffaSHans Petter Selasky *	Allows checking the state of a quick composite pool to determine if
403d6b92ffaSHans Petter Selasky *	invoking member functions is appropriate.
404d6b92ffaSHans Petter Selasky *
405d6b92ffaSHans Petter Selasky * SEE ALSO
406d6b92ffaSHans Petter Selasky *	Quick Composite Pool
407d6b92ffaSHans Petter Selasky *********/
408d6b92ffaSHans Petter Selasky 
409d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Composite Pool/cl_qcpool_init
410d6b92ffaSHans Petter Selasky * NAME
411d6b92ffaSHans Petter Selasky *	cl_qcpool_init
412d6b92ffaSHans Petter Selasky *
413d6b92ffaSHans Petter Selasky * DESCRIPTION
414d6b92ffaSHans Petter Selasky *	The cl_qcpool_init function initializes a quick composite pool for use.
415d6b92ffaSHans Petter Selasky *
416d6b92ffaSHans Petter Selasky * SYNOPSIS
417d6b92ffaSHans Petter Selasky */
418d6b92ffaSHans Petter Selasky cl_status_t
419d6b92ffaSHans Petter Selasky cl_qcpool_init(IN cl_qcpool_t * const p_pool,
420d6b92ffaSHans Petter Selasky 	       IN const size_t min_size,
421d6b92ffaSHans Petter Selasky 	       IN const size_t max_size,
422d6b92ffaSHans Petter Selasky 	       IN const size_t grow_size,
423d6b92ffaSHans Petter Selasky 	       IN const size_t * const component_sizes,
424d6b92ffaSHans Petter Selasky 	       IN const uint32_t num_components,
425d6b92ffaSHans Petter Selasky 	       IN cl_pfn_qcpool_init_t pfn_initializer OPTIONAL,
426d6b92ffaSHans Petter Selasky 	       IN cl_pfn_qcpool_dtor_t pfn_destructor OPTIONAL,
427d6b92ffaSHans Petter Selasky 	       IN const void *const context);
428d6b92ffaSHans Petter Selasky /*
429d6b92ffaSHans Petter Selasky * PARAMETERS
430d6b92ffaSHans Petter Selasky *	p_pool
431d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qcpool_t structure to initialize.
432d6b92ffaSHans Petter Selasky *
433d6b92ffaSHans Petter Selasky *	min_size
434d6b92ffaSHans Petter Selasky *		[in] Minimum number of objects that the pool should support. All
435d6b92ffaSHans Petter Selasky *		necessary allocations to allow storing the minimum number of items
436d6b92ffaSHans Petter Selasky *		are performed at initialization time, and all necessary callbacks
437d6b92ffaSHans Petter Selasky *		successfully invoked.
438d6b92ffaSHans Petter Selasky *
439d6b92ffaSHans Petter Selasky *	max_size
440d6b92ffaSHans Petter Selasky *		[in] Maximum number of objects to which the pool is allowed to grow.
441d6b92ffaSHans Petter Selasky *		A value of zero specifies no maximum.
442d6b92ffaSHans Petter Selasky *
443d6b92ffaSHans Petter Selasky *	grow_size
444d6b92ffaSHans Petter Selasky *		[in] Number of objects to allocate when incrementally growing the pool.
445d6b92ffaSHans Petter Selasky *		A value of zero disables automatic growth.
446d6b92ffaSHans Petter Selasky *
447d6b92ffaSHans Petter Selasky *	component_sizes
448d6b92ffaSHans Petter Selasky *		[in] Pointer to the first entry in an array of sizes describing,
449d6b92ffaSHans Petter Selasky *		in order, the sizes of the components that make up a composite object.
450d6b92ffaSHans Petter Selasky *
451d6b92ffaSHans Petter Selasky *	num_components
452d6b92ffaSHans Petter Selasky *		[in] Number of components that make up a composite object.
453d6b92ffaSHans Petter Selasky *
454d6b92ffaSHans Petter Selasky *	pfn_initializer
455d6b92ffaSHans Petter Selasky *		[in] Initializer callback to invoke for every new object when growing
456d6b92ffaSHans Petter Selasky *		the pool. This parameter may be NULL only if the objects stored in
457d6b92ffaSHans Petter Selasky *		the quick composite pool consist of only one component. If NULL, the
458d6b92ffaSHans Petter Selasky *		pool assumes the cl_pool_item_t structure describing objects is
459d6b92ffaSHans Petter Selasky *		located at the head of each object. See the cl_pfn_qcpool_init_t
460d6b92ffaSHans Petter Selasky *		function type declaration for details about the callback function.
461d6b92ffaSHans Petter Selasky *
462d6b92ffaSHans Petter Selasky *	pfn_destructor
463d6b92ffaSHans Petter Selasky *		[in] Destructor callback to invoke for every object before memory for
464d6b92ffaSHans Petter Selasky *		that object is freed. This parameter is optional and may be NULL.
465d6b92ffaSHans Petter Selasky *		See the cl_pfn_qcpool_dtor_t function type declaration for details
466d6b92ffaSHans Petter Selasky *		about the callback function.
467d6b92ffaSHans Petter Selasky *
468d6b92ffaSHans Petter Selasky *	context
469d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback functions to provide context.
470d6b92ffaSHans Petter Selasky *
471d6b92ffaSHans Petter Selasky * RETURN VALUES
472d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the quick composite pool was initialized successfully.
473d6b92ffaSHans Petter Selasky *
474d6b92ffaSHans Petter Selasky *	CL_INSUFFICIENT_MEMORY if there was not enough memory to initialize the
475d6b92ffaSHans Petter Selasky *	quick composite pool.
476d6b92ffaSHans Petter Selasky *
477d6b92ffaSHans Petter Selasky *	CL_INVALID_SETTING if a NULL constructor was provided for composite objects
478d6b92ffaSHans Petter Selasky *	consisting of more than one component.  Also returns CL_INVALID_SETTING if
479d6b92ffaSHans Petter Selasky *	the maximum size is non-zero and less than the minimum size.
480d6b92ffaSHans Petter Selasky *
481d6b92ffaSHans Petter Selasky *	Other cl_status_t value returned by optional initialization callback function
482d6b92ffaSHans Petter Selasky *	specified by the pfn_initializer parameter.
483d6b92ffaSHans Petter Selasky *
484d6b92ffaSHans Petter Selasky *	If initialization fails, the pool is left in a destroyed state.  Callers
485d6b92ffaSHans Petter Selasky *	may still safely call cl_qcpool_destroy.
486d6b92ffaSHans Petter Selasky *
487d6b92ffaSHans Petter Selasky * NOTES
488d6b92ffaSHans Petter Selasky *	cl_qcpool_init initializes, and if necessary, grows the pool to
489d6b92ffaSHans Petter Selasky *	the capacity desired.
490d6b92ffaSHans Petter Selasky *
491d6b92ffaSHans Petter Selasky * SEE ALSO
492d6b92ffaSHans Petter Selasky *	Quick Composite Pool, cl_qcpool_construct, cl_qcpool_destroy,
493d6b92ffaSHans Petter Selasky *	cl_qcpool_get, cl_qcpool_put, cl_qcpool_grow,
494d6b92ffaSHans Petter Selasky *	cl_qcpool_count, cl_pfn_qcpool_init_t, cl_pfn_qcpool_dtor_t
495d6b92ffaSHans Petter Selasky *********/
496d6b92ffaSHans Petter Selasky 
497d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Composite Pool/cl_qcpool_destroy
498d6b92ffaSHans Petter Selasky * NAME
499d6b92ffaSHans Petter Selasky *	cl_qcpool_destroy
500d6b92ffaSHans Petter Selasky *
501d6b92ffaSHans Petter Selasky * DESCRIPTION
502d6b92ffaSHans Petter Selasky *	The cl_qcpool_destroy function destroys a quick composite pool.
503d6b92ffaSHans Petter Selasky *
504d6b92ffaSHans Petter Selasky * SYNOPSIS
505d6b92ffaSHans Petter Selasky */
506d6b92ffaSHans Petter Selasky void cl_qcpool_destroy(IN cl_qcpool_t * const p_pool);
507d6b92ffaSHans Petter Selasky /*
508d6b92ffaSHans Petter Selasky * PARAMETERS
509d6b92ffaSHans Petter Selasky *	p_pool
510d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qcpool_t structure to destroy.
511d6b92ffaSHans Petter Selasky *
512d6b92ffaSHans Petter Selasky * RETURN VALUE
513d6b92ffaSHans Petter Selasky *	This function does not return a value.
514d6b92ffaSHans Petter Selasky *
515d6b92ffaSHans Petter Selasky * NOTES
516d6b92ffaSHans Petter Selasky *	All memory allocated for composite objects is freed. The destructor
517d6b92ffaSHans Petter Selasky *	callback, if any, will be invoked for every allocated object. Further
518d6b92ffaSHans Petter Selasky *	operations on the composite pool should not be attempted after
519d6b92ffaSHans Petter Selasky *	cl_qcpool_destroy is invoked.
520d6b92ffaSHans Petter Selasky *
521d6b92ffaSHans Petter Selasky *	This function should only be called after a call to
522d6b92ffaSHans Petter Selasky *	cl_qcpool_construct or cl_qcpool_init.
523d6b92ffaSHans Petter Selasky *
524d6b92ffaSHans Petter Selasky *	In a debug build, cl_qcpool_destroy asserts that all objects are in
525d6b92ffaSHans Petter Selasky *	the pool.
526d6b92ffaSHans Petter Selasky *
527d6b92ffaSHans Petter Selasky * SEE ALSO
528d6b92ffaSHans Petter Selasky *	Quick Composite Pool, cl_qcpool_construct, cl_qcpool_init
529d6b92ffaSHans Petter Selasky *********/
530d6b92ffaSHans Petter Selasky 
531d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Composite Pool/cl_qcpool_count
532d6b92ffaSHans Petter Selasky * NAME
533d6b92ffaSHans Petter Selasky *	cl_qcpool_count
534d6b92ffaSHans Petter Selasky *
535d6b92ffaSHans Petter Selasky * DESCRIPTION
536d6b92ffaSHans Petter Selasky *	The cl_qcpool_count function returns the number of available objects
537d6b92ffaSHans Petter Selasky *	in a quick composite pool.
538d6b92ffaSHans Petter Selasky *
539d6b92ffaSHans Petter Selasky * SYNOPSIS
540d6b92ffaSHans Petter Selasky */
cl_qcpool_count(IN cl_qcpool_t * const p_pool)541d6b92ffaSHans Petter Selasky static inline size_t cl_qcpool_count(IN cl_qcpool_t * const p_pool)
542d6b92ffaSHans Petter Selasky {
543d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool);
544d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool->state == CL_INITIALIZED);
545d6b92ffaSHans Petter Selasky 
546d6b92ffaSHans Petter Selasky 	return (cl_qlist_count(&p_pool->free_list));
547d6b92ffaSHans Petter Selasky }
548d6b92ffaSHans Petter Selasky 
549d6b92ffaSHans Petter Selasky /*
550d6b92ffaSHans Petter Selasky * PARAMETERS
551d6b92ffaSHans Petter Selasky *	p_pool
552d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qcpool_t structure for which the number of
553d6b92ffaSHans Petter Selasky *		available objects is requested.
554d6b92ffaSHans Petter Selasky *
555d6b92ffaSHans Petter Selasky * RETURN VALUE
556d6b92ffaSHans Petter Selasky *	Returns the number of objects available in the specified
557d6b92ffaSHans Petter Selasky *	quick composite pool.
558d6b92ffaSHans Petter Selasky *
559d6b92ffaSHans Petter Selasky * SEE ALSO
560d6b92ffaSHans Petter Selasky *	Quick Composite Pool
561d6b92ffaSHans Petter Selasky *********/
562d6b92ffaSHans Petter Selasky 
563d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Composite Pool/cl_qcpool_get
564d6b92ffaSHans Petter Selasky * NAME
565d6b92ffaSHans Petter Selasky *	cl_qcpool_get
566d6b92ffaSHans Petter Selasky *
567d6b92ffaSHans Petter Selasky * DESCRIPTION
568d6b92ffaSHans Petter Selasky *	The cl_qcpool_get function retrieves an object from a
569d6b92ffaSHans Petter Selasky *	quick composite pool.
570d6b92ffaSHans Petter Selasky *
571d6b92ffaSHans Petter Selasky * SYNOPSIS
572d6b92ffaSHans Petter Selasky */
573d6b92ffaSHans Petter Selasky cl_pool_item_t *cl_qcpool_get(IN cl_qcpool_t * const p_pool);
574d6b92ffaSHans Petter Selasky /*
575d6b92ffaSHans Petter Selasky * PARAMETERS
576d6b92ffaSHans Petter Selasky *	p_pool
577d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qcpool_t structure from which to retrieve
578d6b92ffaSHans Petter Selasky *		an object.
579d6b92ffaSHans Petter Selasky *
580d6b92ffaSHans Petter Selasky * RETURN VALUES
581d6b92ffaSHans Petter Selasky *	Returns a pointer to a cl_pool_item_t for a composite object.
582d6b92ffaSHans Petter Selasky *
583d6b92ffaSHans Petter Selasky *	Returns NULL if the pool is empty and can not be grown automatically.
584d6b92ffaSHans Petter Selasky *
585d6b92ffaSHans Petter Selasky * NOTES
586d6b92ffaSHans Petter Selasky *	cl_qcpool_get returns the object at the head of the pool. If the pool is
587d6b92ffaSHans Petter Selasky *	empty, it is automatically grown to accommodate this request unless the
588d6b92ffaSHans Petter Selasky *	grow_size parameter passed to the cl_qcpool_init function was zero.
589d6b92ffaSHans Petter Selasky *
590d6b92ffaSHans Petter Selasky * SEE ALSO
591d6b92ffaSHans Petter Selasky *	Quick Composite Pool, cl_qcpool_get_tail, cl_qcpool_put,
592d6b92ffaSHans Petter Selasky *	cl_qcpool_grow, cl_qcpool_count
593d6b92ffaSHans Petter Selasky *********/
594d6b92ffaSHans Petter Selasky 
595d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Composite Pool/cl_qcpool_put
596d6b92ffaSHans Petter Selasky * NAME
597d6b92ffaSHans Petter Selasky *	cl_qcpool_put
598d6b92ffaSHans Petter Selasky *
599d6b92ffaSHans Petter Selasky * DESCRIPTION
600d6b92ffaSHans Petter Selasky *	The cl_qcpool_put function returns an object to a quick composite pool.
601d6b92ffaSHans Petter Selasky *
602d6b92ffaSHans Petter Selasky * SYNOPSIS
603d6b92ffaSHans Petter Selasky */
604d6b92ffaSHans Petter Selasky static inline void
cl_qcpool_put(IN cl_qcpool_t * const p_pool,IN cl_pool_item_t * const p_pool_item)605d6b92ffaSHans Petter Selasky cl_qcpool_put(IN cl_qcpool_t * const p_pool,
606d6b92ffaSHans Petter Selasky 	      IN cl_pool_item_t * const p_pool_item)
607d6b92ffaSHans Petter Selasky {
608d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool);
609d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool->state == CL_INITIALIZED);
610d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool_item);
611d6b92ffaSHans Petter Selasky 	/* Make sure items being returned came from the specified pool. */
612d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool_item->p_pool == p_pool);
613d6b92ffaSHans Petter Selasky 
614d6b92ffaSHans Petter Selasky 	/* return this lil' doggy to the pool */
615d6b92ffaSHans Petter Selasky 	cl_qlist_insert_head(&p_pool->free_list, &p_pool_item->list_item);
616d6b92ffaSHans Petter Selasky }
617d6b92ffaSHans Petter Selasky 
618d6b92ffaSHans Petter Selasky /*
619d6b92ffaSHans Petter Selasky * PARAMETERS
620d6b92ffaSHans Petter Selasky *	p_pool
621d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qcpool_t structure to which to return
622d6b92ffaSHans Petter Selasky *		an object.
623d6b92ffaSHans Petter Selasky *
624d6b92ffaSHans Petter Selasky *	p_pool_item
625d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_pool_item_t structure for the object
626d6b92ffaSHans Petter Selasky *		being returned.
627d6b92ffaSHans Petter Selasky *
628d6b92ffaSHans Petter Selasky * RETURN VALUE
629d6b92ffaSHans Petter Selasky *	This function does not return a value.
630d6b92ffaSHans Petter Selasky *
631d6b92ffaSHans Petter Selasky * NOTES
632d6b92ffaSHans Petter Selasky *	cl_qcpool_put places the returned object at the head of the pool.
633d6b92ffaSHans Petter Selasky *
634d6b92ffaSHans Petter Selasky *	The object specified by the p_pool_item parameter must have been
635d6b92ffaSHans Petter Selasky *	retrieved from the pool by a previous call to cl_qcpool_get.
636d6b92ffaSHans Petter Selasky *
637d6b92ffaSHans Petter Selasky * SEE ALSO
638d6b92ffaSHans Petter Selasky *	Quick Composite Pool, cl_qcpool_put_tail, cl_qcpool_get
639d6b92ffaSHans Petter Selasky *********/
640d6b92ffaSHans Petter Selasky 
641d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Composite Pool/cl_qcpool_put_list
642d6b92ffaSHans Petter Selasky * NAME
643d6b92ffaSHans Petter Selasky *	cl_qcpool_put_list
644d6b92ffaSHans Petter Selasky *
645d6b92ffaSHans Petter Selasky * DESCRIPTION
646d6b92ffaSHans Petter Selasky *	The cl_qcpool_put_list function returns a list of objects to the head of
647d6b92ffaSHans Petter Selasky *	a quick composite pool.
648d6b92ffaSHans Petter Selasky *
649d6b92ffaSHans Petter Selasky * SYNOPSIS
650d6b92ffaSHans Petter Selasky */
651d6b92ffaSHans Petter Selasky static inline void
cl_qcpool_put_list(IN cl_qcpool_t * const p_pool,IN cl_qlist_t * const p_list)652d6b92ffaSHans Petter Selasky cl_qcpool_put_list(IN cl_qcpool_t * const p_pool, IN cl_qlist_t * const p_list)
653d6b92ffaSHans Petter Selasky {
654d6b92ffaSHans Petter Selasky #ifdef _DEBUG_
655d6b92ffaSHans Petter Selasky 	cl_list_item_t *p_item;
656d6b92ffaSHans Petter Selasky #endif
657d6b92ffaSHans Petter Selasky 
658d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool);
659d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool->state == CL_INITIALIZED);
660d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_list);
661d6b92ffaSHans Petter Selasky 
662d6b92ffaSHans Petter Selasky #ifdef _DEBUG_
663d6b92ffaSHans Petter Selasky 	/* Chech that all items in the list came from this pool. */
664d6b92ffaSHans Petter Selasky 	p_item = cl_qlist_head(p_list);
665d6b92ffaSHans Petter Selasky 	while (p_item != cl_qlist_end(p_list)) {
666d6b92ffaSHans Petter Selasky 		CL_ASSERT(((cl_pool_item_t *) p_item)->p_pool == p_pool);
667d6b92ffaSHans Petter Selasky 		p_item = cl_qlist_next(p_item);
668d6b92ffaSHans Petter Selasky 	}
669d6b92ffaSHans Petter Selasky #endif
670d6b92ffaSHans Petter Selasky 
671d6b92ffaSHans Petter Selasky 	/* return these lil' doggies to the pool */
672d6b92ffaSHans Petter Selasky 	cl_qlist_insert_list_head(&p_pool->free_list, p_list);
673d6b92ffaSHans Petter Selasky }
674d6b92ffaSHans Petter Selasky 
675d6b92ffaSHans Petter Selasky /*
676d6b92ffaSHans Petter Selasky * PARAMETERS
677d6b92ffaSHans Petter Selasky *	p_pool
678d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qcpool_t structure to which to return
679d6b92ffaSHans Petter Selasky *		a list of objects.
680d6b92ffaSHans Petter Selasky *
681d6b92ffaSHans Petter Selasky *	p_list
682d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qlist_t structure for the list of objects
683d6b92ffaSHans Petter Selasky *		being returned.
684d6b92ffaSHans Petter Selasky *
685d6b92ffaSHans Petter Selasky * RETURN VALUE
686d6b92ffaSHans Petter Selasky *	This function does not return a value.
687d6b92ffaSHans Petter Selasky *
688d6b92ffaSHans Petter Selasky * NOTES
689d6b92ffaSHans Petter Selasky *	cl_qcpool_put_list places the returned objects at the head of the pool.
690d6b92ffaSHans Petter Selasky *
691d6b92ffaSHans Petter Selasky *	The objects in the list specified by the p_list parameter must have been
692d6b92ffaSHans Petter Selasky *	retrieved from the pool by a previous call to cl_qcpool_get.
693d6b92ffaSHans Petter Selasky *
694d6b92ffaSHans Petter Selasky * SEE ALSO
695d6b92ffaSHans Petter Selasky *	Quick Composite Pool, cl_qcpool_put, cl_qcpool_put_tail, cl_qcpool_get
696d6b92ffaSHans Petter Selasky *********/
697d6b92ffaSHans Petter Selasky 
698d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Composite Pool/cl_qcpool_grow
699d6b92ffaSHans Petter Selasky * NAME
700d6b92ffaSHans Petter Selasky *	cl_qcpool_grow
701d6b92ffaSHans Petter Selasky *
702d6b92ffaSHans Petter Selasky * DESCRIPTION
703d6b92ffaSHans Petter Selasky *	The cl_qcpool_grow function grows a quick composite pool by
704d6b92ffaSHans Petter Selasky *	the specified number of objects.
705d6b92ffaSHans Petter Selasky *
706d6b92ffaSHans Petter Selasky * SYNOPSIS
707d6b92ffaSHans Petter Selasky */
708d6b92ffaSHans Petter Selasky cl_status_t cl_qcpool_grow(IN cl_qcpool_t * const p_pool, IN size_t obj_count);
709d6b92ffaSHans Petter Selasky /*
710d6b92ffaSHans Petter Selasky * PARAMETERS
711d6b92ffaSHans Petter Selasky *	p_pool
712d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_qcpool_t structure whose capacity to grow.
713d6b92ffaSHans Petter Selasky *
714d6b92ffaSHans Petter Selasky *	obj_count
715d6b92ffaSHans Petter Selasky *		[in] Number of objects by which to grow the pool.
716d6b92ffaSHans Petter Selasky *
717d6b92ffaSHans Petter Selasky * RETURN VALUES
718d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the quick composite pool grew successfully.
719d6b92ffaSHans Petter Selasky *
720d6b92ffaSHans Petter Selasky *	CL_INSUFFICIENT_MEMORY if there was not enough memory to grow the
721d6b92ffaSHans Petter Selasky *	quick composite pool.
722d6b92ffaSHans Petter Selasky *
723d6b92ffaSHans Petter Selasky *	cl_status_t value returned by optional initialization callback function
724d6b92ffaSHans Petter Selasky *	specified by the pfn_initializer parameter passed to the
725d6b92ffaSHans Petter Selasky *	cl_qcpool_init function.
726d6b92ffaSHans Petter Selasky *
727d6b92ffaSHans Petter Selasky * NOTES
728d6b92ffaSHans Petter Selasky *	It is not necessary to call cl_qcpool_grow if the pool is
729d6b92ffaSHans Petter Selasky *	configured to grow automatically.
730d6b92ffaSHans Petter Selasky *
731d6b92ffaSHans Petter Selasky * SEE ALSO
732d6b92ffaSHans Petter Selasky *	Quick Composite Pool
733d6b92ffaSHans Petter Selasky *********/
734d6b92ffaSHans Petter Selasky 
735d6b92ffaSHans Petter Selasky END_C_DECLS
736d6b92ffaSHans Petter Selasky #endif				/* _CL_QUICK_COMPOSITE_POOL_H_ */
737