xref: /freebsd/contrib/ofed/opensm/include/complib/cl_pool.h (revision 87181516ef48be852d5e5fee53c6e0dbfc62f21e)
1*d6b92ffaSHans Petter Selasky /*
2*d6b92ffaSHans Petter Selasky  * Copyright (c) 2004, 2005 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 the pool.
39*d6b92ffaSHans Petter Selasky  *	The pool manages a pool of objects.
40*d6b92ffaSHans Petter Selasky  *	The pool can grow to meet demand, limited only by system memory.
41*d6b92ffaSHans Petter Selasky  */
42*d6b92ffaSHans Petter Selasky 
43*d6b92ffaSHans Petter Selasky #ifndef _CL_POOL_H_
44*d6b92ffaSHans Petter Selasky #define _CL_POOL_H_
45*d6b92ffaSHans Petter Selasky 
46*d6b92ffaSHans Petter Selasky #include <complib/cl_qcomppool.h>
47*d6b92ffaSHans Petter Selasky 
48*d6b92ffaSHans Petter Selasky #ifdef __cplusplus
49*d6b92ffaSHans Petter Selasky #  define BEGIN_C_DECLS extern "C" {
50*d6b92ffaSHans Petter Selasky #  define END_C_DECLS   }
51*d6b92ffaSHans Petter Selasky #else				/* !__cplusplus */
52*d6b92ffaSHans Petter Selasky #  define BEGIN_C_DECLS
53*d6b92ffaSHans Petter Selasky #  define END_C_DECLS
54*d6b92ffaSHans Petter Selasky #endif				/* __cplusplus */
55*d6b92ffaSHans Petter Selasky 
56*d6b92ffaSHans Petter Selasky BEGIN_C_DECLS
57*d6b92ffaSHans Petter Selasky /****h* Component Library/Pool
58*d6b92ffaSHans Petter Selasky * NAME
59*d6b92ffaSHans Petter Selasky *	Pool
60*d6b92ffaSHans Petter Selasky *
61*d6b92ffaSHans Petter Selasky * DESCRIPTION
62*d6b92ffaSHans Petter Selasky *	The pool provides a self-contained and self-sustaining pool
63*d6b92ffaSHans Petter Selasky *	of user defined objects.
64*d6b92ffaSHans Petter Selasky *
65*d6b92ffaSHans Petter Selasky *	To aid in object oriented design, the pool provides the user
66*d6b92ffaSHans Petter Selasky *	the ability to specify callbacks that are invoked for each object for
67*d6b92ffaSHans Petter Selasky *	construction, initialization, and destruction. Constructor and destructor
68*d6b92ffaSHans Petter Selasky *	callback functions may not fail.
69*d6b92ffaSHans Petter Selasky *
70*d6b92ffaSHans Petter Selasky *	A pool does not return memory to the system as the user returns
71*d6b92ffaSHans Petter Selasky *	objects to the pool. The only method of returning memory to the system is
72*d6b92ffaSHans Petter Selasky *	to destroy the pool.
73*d6b92ffaSHans Petter Selasky *
74*d6b92ffaSHans Petter Selasky *	The Pool functions operate on a cl_pool_t structure which should be treated
75*d6b92ffaSHans Petter Selasky *	as opaque and should be manipulated only through the provided functions.
76*d6b92ffaSHans Petter Selasky *
77*d6b92ffaSHans Petter Selasky * SEE ALSO
78*d6b92ffaSHans Petter Selasky *	Structures:
79*d6b92ffaSHans Petter Selasky *		cl_pool_t
80*d6b92ffaSHans Petter Selasky *
81*d6b92ffaSHans Petter Selasky *	Callbacks:
82*d6b92ffaSHans Petter Selasky *		cl_pfn_pool_init_t, cl_pfn_pool_dtor_t
83*d6b92ffaSHans Petter Selasky *
84*d6b92ffaSHans Petter Selasky *	Initialization/Destruction:
85*d6b92ffaSHans Petter Selasky *		cl_pool_construct, cl_pool_init, cl_pool_destroy
86*d6b92ffaSHans Petter Selasky *
87*d6b92ffaSHans Petter Selasky *	Manipulation:
88*d6b92ffaSHans Petter Selasky *		cl_pool_get, cl_pool_put, cl_pool_grow
89*d6b92ffaSHans Petter Selasky *
90*d6b92ffaSHans Petter Selasky *	Attributes:
91*d6b92ffaSHans Petter Selasky *		cl_is_pool_inited, cl_pool_count
92*d6b92ffaSHans Petter Selasky *********/
93*d6b92ffaSHans Petter Selasky /****d* Component Library: Pool/cl_pfn_pool_init_t
94*d6b92ffaSHans Petter Selasky * NAME
95*d6b92ffaSHans Petter Selasky *	cl_pfn_pool_init_t
96*d6b92ffaSHans Petter Selasky *
97*d6b92ffaSHans Petter Selasky * DESCRIPTION
98*d6b92ffaSHans Petter Selasky *	The cl_pfn_pool_init_t function type defines the prototype for
99*d6b92ffaSHans Petter Selasky *	functions used as initializers for objects being allocated by a
100*d6b92ffaSHans Petter Selasky *	pool.
101*d6b92ffaSHans Petter Selasky *
102*d6b92ffaSHans Petter Selasky * SYNOPSIS
103*d6b92ffaSHans Petter Selasky */
104*d6b92ffaSHans Petter Selasky typedef cl_status_t
105*d6b92ffaSHans Petter Selasky     (*cl_pfn_pool_init_t) (IN void *const p_object, IN void *context);
106*d6b92ffaSHans Petter Selasky /*
107*d6b92ffaSHans Petter Selasky * PARAMETERS
108*d6b92ffaSHans Petter Selasky *	p_object
109*d6b92ffaSHans Petter Selasky *		[in] Pointer to an object to initialize.
110*d6b92ffaSHans Petter Selasky *
111*d6b92ffaSHans Petter Selasky *	context
112*d6b92ffaSHans Petter Selasky *		[in] Context provided in a call to cl_pool_init.
113*d6b92ffaSHans Petter Selasky *
114*d6b92ffaSHans Petter Selasky * RETURN VALUES
115*d6b92ffaSHans Petter Selasky *	Return CL_SUCCESS to indicates that initialization of the object
116*d6b92ffaSHans Petter Selasky *	was successful and initialization of further objects may continue.
117*d6b92ffaSHans Petter Selasky *
118*d6b92ffaSHans Petter Selasky *	Other cl_status_t values will be returned by cl_pool_init
119*d6b92ffaSHans Petter Selasky *	and cl_pool_grow.
120*d6b92ffaSHans Petter Selasky *
121*d6b92ffaSHans Petter Selasky * NOTES
122*d6b92ffaSHans Petter Selasky *	This function type is provided as function prototype reference for
123*d6b92ffaSHans Petter Selasky *	the function provided by the user as an optional parameter to the
124*d6b92ffaSHans Petter Selasky *	cl_pool_init function.
125*d6b92ffaSHans Petter Selasky *
126*d6b92ffaSHans Petter Selasky *	The initializer is invoked once per allocated object, allowing the user
127*d6b92ffaSHans Petter Selasky *	to trap initialization failures. Returning a status other than CL_SUCCESS
128*d6b92ffaSHans Petter Selasky *	aborts a grow operation, initiated either through cl_pool_init or
129*d6b92ffaSHans Petter Selasky *	cl_pool_grow, and causes the initiating function to fail.
130*d6b92ffaSHans Petter Selasky *	Any non-CL_SUCCESS status will be returned by the function that initiated
131*d6b92ffaSHans Petter Selasky *	the grow operation.
132*d6b92ffaSHans Petter Selasky *
133*d6b92ffaSHans Petter Selasky * SEE ALSO
134*d6b92ffaSHans Petter Selasky *	Pool, cl_pool_init, cl_pool_grow
135*d6b92ffaSHans Petter Selasky *********/
136*d6b92ffaSHans Petter Selasky 
137*d6b92ffaSHans Petter Selasky /****d* Component Library: Pool/cl_pfn_pool_dtor_t
138*d6b92ffaSHans Petter Selasky * NAME
139*d6b92ffaSHans Petter Selasky *	cl_pfn_pool_dtor_t
140*d6b92ffaSHans Petter Selasky *
141*d6b92ffaSHans Petter Selasky * DESCRIPTION
142*d6b92ffaSHans Petter Selasky *	The cl_pfn_pool_dtor_t function type defines the prototype for
143*d6b92ffaSHans Petter Selasky *	functions used as destructor for objects being deallocated by a
144*d6b92ffaSHans Petter Selasky *	pool.
145*d6b92ffaSHans Petter Selasky *
146*d6b92ffaSHans Petter Selasky * SYNOPSIS
147*d6b92ffaSHans Petter Selasky */
148*d6b92ffaSHans Petter Selasky typedef void
149*d6b92ffaSHans Petter Selasky  (*cl_pfn_pool_dtor_t) (IN void *const p_object, IN void *context);
150*d6b92ffaSHans Petter Selasky /*
151*d6b92ffaSHans Petter Selasky * PARAMETERS
152*d6b92ffaSHans Petter Selasky *	p_object
153*d6b92ffaSHans Petter Selasky *		[in] Pointer to an object to destruct.
154*d6b92ffaSHans Petter Selasky *
155*d6b92ffaSHans Petter Selasky *	context
156*d6b92ffaSHans Petter Selasky *		[in] Context provided in the call to cl_pool_init.
157*d6b92ffaSHans Petter Selasky *
158*d6b92ffaSHans Petter Selasky * RETURN VALUE
159*d6b92ffaSHans Petter Selasky *	This function does not return a value.
160*d6b92ffaSHans Petter Selasky *
161*d6b92ffaSHans Petter Selasky * NOTES
162*d6b92ffaSHans Petter Selasky *	This function type is provided as function prototype reference for
163*d6b92ffaSHans Petter Selasky *	the function provided by the user as an optional parameter to the
164*d6b92ffaSHans Petter Selasky *	cl_pool_init function.
165*d6b92ffaSHans Petter Selasky *
166*d6b92ffaSHans Petter Selasky *	The destructor is invoked once per allocated object, allowing the user
167*d6b92ffaSHans Petter Selasky *	to perform any necessary cleanup. Users should not attempt to deallocate
168*d6b92ffaSHans Petter Selasky *	the memory for the object, as the pool manages object
169*d6b92ffaSHans Petter Selasky *	allocation and deallocation.
170*d6b92ffaSHans Petter Selasky *
171*d6b92ffaSHans Petter Selasky * SEE ALSO
172*d6b92ffaSHans Petter Selasky *	Pool, cl_pool_init
173*d6b92ffaSHans Petter Selasky *********/
174*d6b92ffaSHans Petter Selasky 
175*d6b92ffaSHans Petter Selasky /****s* Component Library: Pool/cl_pool_t
176*d6b92ffaSHans Petter Selasky * NAME
177*d6b92ffaSHans Petter Selasky *	cl_pool_t
178*d6b92ffaSHans Petter Selasky *
179*d6b92ffaSHans Petter Selasky * DESCRIPTION
180*d6b92ffaSHans Petter Selasky *	pool structure.
181*d6b92ffaSHans Petter Selasky *
182*d6b92ffaSHans Petter Selasky *	The cl_pool_t structure should be treated as opaque and should be
183*d6b92ffaSHans Petter Selasky *	manipulated only through the provided functions.
184*d6b92ffaSHans Petter Selasky *
185*d6b92ffaSHans Petter Selasky * SYNOPSIS
186*d6b92ffaSHans Petter Selasky */
187*d6b92ffaSHans Petter Selasky typedef struct _cl_pool {
188*d6b92ffaSHans Petter Selasky 	cl_qcpool_t qcpool;
189*d6b92ffaSHans Petter Selasky 	cl_pfn_pool_init_t pfn_init;
190*d6b92ffaSHans Petter Selasky 	cl_pfn_pool_dtor_t pfn_dtor;
191*d6b92ffaSHans Petter Selasky 	const void *context;
192*d6b92ffaSHans Petter Selasky } cl_pool_t;
193*d6b92ffaSHans Petter Selasky /*
194*d6b92ffaSHans Petter Selasky * FIELDS
195*d6b92ffaSHans Petter Selasky *	qcpool
196*d6b92ffaSHans Petter Selasky *		Quick composite pool that manages all objects.
197*d6b92ffaSHans Petter Selasky *
198*d6b92ffaSHans Petter Selasky *	pfn_init
199*d6b92ffaSHans Petter Selasky *		Pointer to the user's initializer callback, used by the pool
200*d6b92ffaSHans Petter Selasky *		to translate the quick composite pool's initializer callback to
201*d6b92ffaSHans Petter Selasky *		a pool initializer callback.
202*d6b92ffaSHans Petter Selasky *
203*d6b92ffaSHans Petter Selasky *	pfn_dtor
204*d6b92ffaSHans Petter Selasky *		Pointer to the user's destructor callback, used by the pool
205*d6b92ffaSHans Petter Selasky *		to translate the quick composite pool's destructor callback to
206*d6b92ffaSHans Petter Selasky *		a pool destructor callback.
207*d6b92ffaSHans Petter Selasky *
208*d6b92ffaSHans Petter Selasky *	context
209*d6b92ffaSHans Petter Selasky *		User's provided context for callback functions, used by the pool
210*d6b92ffaSHans Petter Selasky *		to when invoking callbacks.
211*d6b92ffaSHans Petter Selasky *
212*d6b92ffaSHans Petter Selasky * SEE ALSO
213*d6b92ffaSHans Petter Selasky *	Pool
214*d6b92ffaSHans Petter Selasky *********/
215*d6b92ffaSHans Petter Selasky 
216*d6b92ffaSHans Petter Selasky /****f* Component Library: Pool/cl_pool_construct
217*d6b92ffaSHans Petter Selasky * NAME
218*d6b92ffaSHans Petter Selasky *	cl_pool_construct
219*d6b92ffaSHans Petter Selasky *
220*d6b92ffaSHans Petter Selasky * DESCRIPTION
221*d6b92ffaSHans Petter Selasky *	The cl_pool_construct function constructs a pool.
222*d6b92ffaSHans Petter Selasky *
223*d6b92ffaSHans Petter Selasky * SYNOPSIS
224*d6b92ffaSHans Petter Selasky */
225*d6b92ffaSHans Petter Selasky void cl_pool_construct(IN cl_pool_t * const p_pool);
226*d6b92ffaSHans Petter Selasky /*
227*d6b92ffaSHans Petter Selasky * PARAMETERS
228*d6b92ffaSHans Petter Selasky *	p_pool
229*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_pool_t structure whose state to initialize.
230*d6b92ffaSHans Petter Selasky *
231*d6b92ffaSHans Petter Selasky * RETURN VALUE
232*d6b92ffaSHans Petter Selasky *	This function does not return a value.
233*d6b92ffaSHans Petter Selasky *
234*d6b92ffaSHans Petter Selasky * NOTES
235*d6b92ffaSHans Petter Selasky *	Allows calling cl_pool_init, cl_pool_destroy, and cl_is_pool_inited.
236*d6b92ffaSHans Petter Selasky *
237*d6b92ffaSHans Petter Selasky *	Calling cl_pool_construct is a prerequisite to calling any other
238*d6b92ffaSHans Petter Selasky *	pool function except cl_pool_init.
239*d6b92ffaSHans Petter Selasky *
240*d6b92ffaSHans Petter Selasky * SEE ALSO
241*d6b92ffaSHans Petter Selasky *	Pool, cl_pool_init, cl_pool_destroy, cl_is_pool_inited
242*d6b92ffaSHans Petter Selasky *********/
243*d6b92ffaSHans Petter Selasky 
244*d6b92ffaSHans Petter Selasky /****f* Component Library: Pool/cl_is_pool_inited
245*d6b92ffaSHans Petter Selasky * NAME
246*d6b92ffaSHans Petter Selasky *	cl_is_pool_inited
247*d6b92ffaSHans Petter Selasky *
248*d6b92ffaSHans Petter Selasky * DESCRIPTION
249*d6b92ffaSHans Petter Selasky *	The cl_is_pool_inited function returns whether a pool was successfully
250*d6b92ffaSHans Petter Selasky *	initialized.
251*d6b92ffaSHans Petter Selasky *
252*d6b92ffaSHans Petter Selasky * SYNOPSIS
253*d6b92ffaSHans Petter Selasky */
cl_is_pool_inited(IN const cl_pool_t * const p_pool)254*d6b92ffaSHans Petter Selasky static inline uint32_t cl_is_pool_inited(IN const cl_pool_t * const p_pool)
255*d6b92ffaSHans Petter Selasky {
256*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT that a non-null pointer is provided. */
257*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool);
258*d6b92ffaSHans Petter Selasky 	return (cl_is_qcpool_inited(&p_pool->qcpool));
259*d6b92ffaSHans Petter Selasky }
260*d6b92ffaSHans Petter Selasky 
261*d6b92ffaSHans Petter Selasky /*
262*d6b92ffaSHans Petter Selasky * PARAMETERS
263*d6b92ffaSHans Petter Selasky *	p_pool
264*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_pool_t structure whose initialization state
265*d6b92ffaSHans Petter Selasky *		to check.
266*d6b92ffaSHans Petter Selasky *
267*d6b92ffaSHans Petter Selasky * RETURN VALUES
268*d6b92ffaSHans Petter Selasky *	TRUE if the pool was initialized successfully.
269*d6b92ffaSHans Petter Selasky *
270*d6b92ffaSHans Petter Selasky *	FALSE otherwise.
271*d6b92ffaSHans Petter Selasky *
272*d6b92ffaSHans Petter Selasky * NOTES
273*d6b92ffaSHans Petter Selasky *	Allows checking the state of a pool to determine if invoking member
274*d6b92ffaSHans Petter Selasky *	functions is appropriate.
275*d6b92ffaSHans Petter Selasky *
276*d6b92ffaSHans Petter Selasky * SEE ALSO
277*d6b92ffaSHans Petter Selasky *	Pool
278*d6b92ffaSHans Petter Selasky *********/
279*d6b92ffaSHans Petter Selasky 
280*d6b92ffaSHans Petter Selasky /****f* Component Library: Pool/cl_pool_init
281*d6b92ffaSHans Petter Selasky * NAME
282*d6b92ffaSHans Petter Selasky *	cl_pool_init
283*d6b92ffaSHans Petter Selasky *
284*d6b92ffaSHans Petter Selasky * DESCRIPTION
285*d6b92ffaSHans Petter Selasky *	The cl_pool_init function initializes a pool for use.
286*d6b92ffaSHans Petter Selasky *
287*d6b92ffaSHans Petter Selasky * SYNOPSIS
288*d6b92ffaSHans Petter Selasky */
289*d6b92ffaSHans Petter Selasky cl_status_t
290*d6b92ffaSHans Petter Selasky cl_pool_init(IN cl_pool_t * const p_pool,
291*d6b92ffaSHans Petter Selasky 	     IN const size_t min_count,
292*d6b92ffaSHans Petter Selasky 	     IN const size_t max_count,
293*d6b92ffaSHans Petter Selasky 	     IN const size_t grow_size,
294*d6b92ffaSHans Petter Selasky 	     IN const size_t object_size,
295*d6b92ffaSHans Petter Selasky 	     IN cl_pfn_pool_init_t pfn_initializer OPTIONAL,
296*d6b92ffaSHans Petter Selasky 	     IN cl_pfn_pool_dtor_t pfn_destructor OPTIONAL,
297*d6b92ffaSHans Petter Selasky 	     IN const void *const context);
298*d6b92ffaSHans Petter Selasky /*
299*d6b92ffaSHans Petter Selasky * PARAMETERS
300*d6b92ffaSHans Petter Selasky *	p_pool
301*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_pool_t structure to initialize.
302*d6b92ffaSHans Petter Selasky *
303*d6b92ffaSHans Petter Selasky *	min_count
304*d6b92ffaSHans Petter Selasky *		[in] Minimum number of objects that the pool should support. All
305*d6b92ffaSHans Petter Selasky *		necessary allocations to allow storing the minimum number of items
306*d6b92ffaSHans Petter Selasky *		are performed at initialization time, and all necessary callbacks
307*d6b92ffaSHans Petter Selasky *		invoked.
308*d6b92ffaSHans Petter Selasky *
309*d6b92ffaSHans Petter Selasky *	max_count
310*d6b92ffaSHans Petter Selasky *		[in] Maximum number of objects to which the pool is allowed to grow.
311*d6b92ffaSHans Petter Selasky *		A value of zero specifies no maximum.
312*d6b92ffaSHans Petter Selasky *
313*d6b92ffaSHans Petter Selasky *	grow_size
314*d6b92ffaSHans Petter Selasky *		[in] Number of objects to allocate when incrementally growing the pool.
315*d6b92ffaSHans Petter Selasky *		A value of zero disables automatic growth.
316*d6b92ffaSHans Petter Selasky *
317*d6b92ffaSHans Petter Selasky *	object_size
318*d6b92ffaSHans Petter Selasky *		[in] Size, in bytes, of each object.
319*d6b92ffaSHans Petter Selasky *
320*d6b92ffaSHans Petter Selasky *	pfn_initializer
321*d6b92ffaSHans Petter Selasky *		[in] Initialization callback to invoke for every new object when
322*d6b92ffaSHans Petter Selasky *		growing the pool. This parameter is optional and may be NULL.
323*d6b92ffaSHans Petter Selasky *		See the cl_pfn_pool_init_t function type declaration for details
324*d6b92ffaSHans Petter Selasky *		about the callback function.
325*d6b92ffaSHans Petter Selasky *
326*d6b92ffaSHans Petter Selasky *	pfn_destructor
327*d6b92ffaSHans Petter Selasky *		[in] Destructor callback to invoke for every object before memory for
328*d6b92ffaSHans Petter Selasky *		that object is freed. This parameter is optional and may be NULL.
329*d6b92ffaSHans Petter Selasky *		See the cl_pfn_pool_dtor_t function type declaration for details
330*d6b92ffaSHans Petter Selasky *		about the callback function.
331*d6b92ffaSHans Petter Selasky *
332*d6b92ffaSHans Petter Selasky *	context
333*d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback functions to provide context.
334*d6b92ffaSHans Petter Selasky *
335*d6b92ffaSHans Petter Selasky * RETURN VALUES
336*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the pool was initialized successfully.
337*d6b92ffaSHans Petter Selasky *
338*d6b92ffaSHans Petter Selasky *	CL_INSUFFICIENT_MEMORY if there was not enough memory to initialize the
339*d6b92ffaSHans Petter Selasky *	pool.
340*d6b92ffaSHans Petter Selasky *
341*d6b92ffaSHans Petter Selasky *	CL_INVALID_SETTING if a the maximum size is non-zero and less than the
342*d6b92ffaSHans Petter Selasky *	minimum size.
343*d6b92ffaSHans Petter Selasky *
344*d6b92ffaSHans Petter Selasky *	Other cl_status_t value returned by optional initialization callback function
345*d6b92ffaSHans Petter Selasky *	specified by the pfn_initializer parameter.
346*d6b92ffaSHans Petter Selasky *
347*d6b92ffaSHans Petter Selasky * NOTES
348*d6b92ffaSHans Petter Selasky *	cl_pool_init initializes, and if necessary, grows the pool to
349*d6b92ffaSHans Petter Selasky *	the capacity desired.
350*d6b92ffaSHans Petter Selasky *
351*d6b92ffaSHans Petter Selasky * SEE ALSO
352*d6b92ffaSHans Petter Selasky *	Pool, cl_pool_construct, cl_pool_destroy,
353*d6b92ffaSHans Petter Selasky *	cl_pool_get, cl_pool_put, cl_pool_grow,
354*d6b92ffaSHans Petter Selasky *	cl_pool_count, cl_pfn_pool_init_t, cl_pfn_pool_dtor_t
355*d6b92ffaSHans Petter Selasky *********/
356*d6b92ffaSHans Petter Selasky 
357*d6b92ffaSHans Petter Selasky /****f* Component Library: Pool/cl_pool_destroy
358*d6b92ffaSHans Petter Selasky * NAME
359*d6b92ffaSHans Petter Selasky *	cl_pool_destroy
360*d6b92ffaSHans Petter Selasky *
361*d6b92ffaSHans Petter Selasky * DESCRIPTION
362*d6b92ffaSHans Petter Selasky *	The cl_pool_destroy function destroys a pool.
363*d6b92ffaSHans Petter Selasky *
364*d6b92ffaSHans Petter Selasky * SYNOPSIS
365*d6b92ffaSHans Petter Selasky */
cl_pool_destroy(IN cl_pool_t * const p_pool)366*d6b92ffaSHans Petter Selasky static inline void cl_pool_destroy(IN cl_pool_t * const p_pool)
367*d6b92ffaSHans Petter Selasky {
368*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool);
369*d6b92ffaSHans Petter Selasky 	cl_qcpool_destroy(&p_pool->qcpool);
370*d6b92ffaSHans Petter Selasky }
371*d6b92ffaSHans Petter Selasky 
372*d6b92ffaSHans Petter Selasky /*
373*d6b92ffaSHans Petter Selasky * PARAMETERS
374*d6b92ffaSHans Petter Selasky *	p_pool
375*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_pool_t structure to destroy.
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 * NOTES
381*d6b92ffaSHans Petter Selasky *	All memory allocated for objects is freed. The destructor callback,
382*d6b92ffaSHans Petter Selasky *	if any, will be invoked for every allocated object. Further operations
383*d6b92ffaSHans Petter Selasky *	on the pool should not be attempted after cl_pool_destroy
384*d6b92ffaSHans Petter Selasky *	is invoked.
385*d6b92ffaSHans Petter Selasky *
386*d6b92ffaSHans Petter Selasky *	This function should only be called after a call to
387*d6b92ffaSHans Petter Selasky *	cl_pool_construct or cl_pool_init.
388*d6b92ffaSHans Petter Selasky *
389*d6b92ffaSHans Petter Selasky *	In a debug build, cl_pool_destroy asserts that all objects are in
390*d6b92ffaSHans Petter Selasky *	the pool.
391*d6b92ffaSHans Petter Selasky *
392*d6b92ffaSHans Petter Selasky * SEE ALSO
393*d6b92ffaSHans Petter Selasky *	Pool, cl_pool_construct, cl_pool_init
394*d6b92ffaSHans Petter Selasky *********/
395*d6b92ffaSHans Petter Selasky 
396*d6b92ffaSHans Petter Selasky /****f* Component Library: Pool/cl_pool_count
397*d6b92ffaSHans Petter Selasky * NAME
398*d6b92ffaSHans Petter Selasky *	cl_pool_count
399*d6b92ffaSHans Petter Selasky *
400*d6b92ffaSHans Petter Selasky * DESCRIPTION
401*d6b92ffaSHans Petter Selasky *	The cl_pool_count function returns the number of available objects
402*d6b92ffaSHans Petter Selasky *	in a pool.
403*d6b92ffaSHans Petter Selasky *
404*d6b92ffaSHans Petter Selasky * SYNOPSIS
405*d6b92ffaSHans Petter Selasky */
cl_pool_count(IN cl_pool_t * const p_pool)406*d6b92ffaSHans Petter Selasky static inline size_t cl_pool_count(IN cl_pool_t * const p_pool)
407*d6b92ffaSHans Petter Selasky {
408*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool);
409*d6b92ffaSHans Petter Selasky 	return (cl_qcpool_count(&p_pool->qcpool));
410*d6b92ffaSHans Petter Selasky }
411*d6b92ffaSHans Petter Selasky 
412*d6b92ffaSHans Petter Selasky /*
413*d6b92ffaSHans Petter Selasky * PARAMETERS
414*d6b92ffaSHans Petter Selasky *	p_pool
415*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_pool_t structure for which the number of
416*d6b92ffaSHans Petter Selasky *		available objects is requested.
417*d6b92ffaSHans Petter Selasky *
418*d6b92ffaSHans Petter Selasky * RETURN VALUE
419*d6b92ffaSHans Petter Selasky *	Returns the number of objects available in the specified pool.
420*d6b92ffaSHans Petter Selasky *
421*d6b92ffaSHans Petter Selasky * SEE ALSO
422*d6b92ffaSHans Petter Selasky *	Pool
423*d6b92ffaSHans Petter Selasky *********/
424*d6b92ffaSHans Petter Selasky 
425*d6b92ffaSHans Petter Selasky /****f* Component Library: Pool/cl_pool_get
426*d6b92ffaSHans Petter Selasky * NAME
427*d6b92ffaSHans Petter Selasky *	cl_pool_get
428*d6b92ffaSHans Petter Selasky *
429*d6b92ffaSHans Petter Selasky * DESCRIPTION
430*d6b92ffaSHans Petter Selasky *	The cl_pool_get function retrieves an object from a pool.
431*d6b92ffaSHans Petter Selasky *
432*d6b92ffaSHans Petter Selasky * SYNOPSIS
433*d6b92ffaSHans Petter Selasky */
cl_pool_get(IN cl_pool_t * const p_pool)434*d6b92ffaSHans Petter Selasky static inline void *cl_pool_get(IN cl_pool_t * const p_pool)
435*d6b92ffaSHans Petter Selasky {
436*d6b92ffaSHans Petter Selasky 	cl_pool_obj_t *p_pool_obj;
437*d6b92ffaSHans Petter Selasky 
438*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool);
439*d6b92ffaSHans Petter Selasky 
440*d6b92ffaSHans Petter Selasky 	p_pool_obj = (cl_pool_obj_t *) cl_qcpool_get(&p_pool->qcpool);
441*d6b92ffaSHans Petter Selasky 	if (!p_pool_obj)
442*d6b92ffaSHans Petter Selasky 		return (NULL);
443*d6b92ffaSHans Petter Selasky 
444*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool_obj->p_object);
445*d6b92ffaSHans Petter Selasky 	return ((void *)p_pool_obj->p_object);
446*d6b92ffaSHans Petter Selasky }
447*d6b92ffaSHans Petter Selasky 
448*d6b92ffaSHans Petter Selasky /*
449*d6b92ffaSHans Petter Selasky * PARAMETERS
450*d6b92ffaSHans Petter Selasky *	p_pool
451*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_pool_t structure from which to retrieve
452*d6b92ffaSHans Petter Selasky *		an object.
453*d6b92ffaSHans Petter Selasky *
454*d6b92ffaSHans Petter Selasky * RETURN VALUES
455*d6b92ffaSHans Petter Selasky *	Returns a pointer to an object.
456*d6b92ffaSHans Petter Selasky *
457*d6b92ffaSHans Petter Selasky *	Returns NULL if the pool is empty and can not be grown automatically.
458*d6b92ffaSHans Petter Selasky *
459*d6b92ffaSHans Petter Selasky * NOTES
460*d6b92ffaSHans Petter Selasky *	cl_pool_get returns the object at the head of the pool. If the pool is
461*d6b92ffaSHans Petter Selasky *	empty, it is automatically grown to accommodate this request unless the
462*d6b92ffaSHans Petter Selasky *	grow_size parameter passed to the cl_pool_init function was zero.
463*d6b92ffaSHans Petter Selasky *
464*d6b92ffaSHans Petter Selasky * SEE ALSO
465*d6b92ffaSHans Petter Selasky *	Pool, cl_pool_get_tail, cl_pool_put, cl_pool_grow, cl_pool_count
466*d6b92ffaSHans Petter Selasky *********/
467*d6b92ffaSHans Petter Selasky 
468*d6b92ffaSHans Petter Selasky /****f* Component Library: Pool/cl_pool_put
469*d6b92ffaSHans Petter Selasky * NAME
470*d6b92ffaSHans Petter Selasky *	cl_pool_put
471*d6b92ffaSHans Petter Selasky *
472*d6b92ffaSHans Petter Selasky * DESCRIPTION
473*d6b92ffaSHans Petter Selasky *	The cl_pool_put function returns an object to a pool.
474*d6b92ffaSHans Petter Selasky *
475*d6b92ffaSHans Petter Selasky * SYNOPSIS
476*d6b92ffaSHans Petter Selasky */
477*d6b92ffaSHans Petter Selasky static inline void
cl_pool_put(IN cl_pool_t * const p_pool,IN void * const p_object)478*d6b92ffaSHans Petter Selasky cl_pool_put(IN cl_pool_t * const p_pool, IN void *const p_object)
479*d6b92ffaSHans Petter Selasky {
480*d6b92ffaSHans Petter Selasky 	cl_pool_obj_t *p_pool_obj;
481*d6b92ffaSHans Petter Selasky 
482*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool);
483*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_object);
484*d6b92ffaSHans Petter Selasky 
485*d6b92ffaSHans Petter Selasky 	/* Calculate the offset to the list object representing this object. */
486*d6b92ffaSHans Petter Selasky 	p_pool_obj = (cl_pool_obj_t *)
487*d6b92ffaSHans Petter Selasky 	    (((uint8_t *) p_object) - sizeof(cl_pool_obj_t));
488*d6b92ffaSHans Petter Selasky 
489*d6b92ffaSHans Petter Selasky 	/* good sanity check */
490*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool_obj->p_object == p_object);
491*d6b92ffaSHans Petter Selasky 
492*d6b92ffaSHans Petter Selasky 	cl_qcpool_put(&p_pool->qcpool, &p_pool_obj->pool_item);
493*d6b92ffaSHans Petter Selasky }
494*d6b92ffaSHans Petter Selasky 
495*d6b92ffaSHans Petter Selasky /*
496*d6b92ffaSHans Petter Selasky * PARAMETERS
497*d6b92ffaSHans Petter Selasky *	p_pool
498*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_pool_t structure to which to return
499*d6b92ffaSHans Petter Selasky *		an object.
500*d6b92ffaSHans Petter Selasky *
501*d6b92ffaSHans Petter Selasky *	p_object
502*d6b92ffaSHans Petter Selasky *		[in] Pointer to an object to return to the pool.
503*d6b92ffaSHans Petter Selasky *
504*d6b92ffaSHans Petter Selasky * RETURN VALUE
505*d6b92ffaSHans Petter Selasky *	This function does not return a value.
506*d6b92ffaSHans Petter Selasky *
507*d6b92ffaSHans Petter Selasky * NOTES
508*d6b92ffaSHans Petter Selasky *	cl_pool_put places the returned object at the head of the pool.
509*d6b92ffaSHans Petter Selasky *
510*d6b92ffaSHans Petter Selasky *	The object specified by the p_object parameter must have been
511*d6b92ffaSHans Petter Selasky *	retrieved from the pool by a previous call to cl_pool_get.
512*d6b92ffaSHans Petter Selasky *
513*d6b92ffaSHans Petter Selasky * SEE ALSO
514*d6b92ffaSHans Petter Selasky *	Pool, cl_pool_put_tail, cl_pool_get
515*d6b92ffaSHans Petter Selasky *********/
516*d6b92ffaSHans Petter Selasky 
517*d6b92ffaSHans Petter Selasky /****f* Component Library: Pool/cl_pool_grow
518*d6b92ffaSHans Petter Selasky * NAME
519*d6b92ffaSHans Petter Selasky *	cl_pool_grow
520*d6b92ffaSHans Petter Selasky *
521*d6b92ffaSHans Petter Selasky * DESCRIPTION
522*d6b92ffaSHans Petter Selasky *	The cl_pool_grow function grows a pool by
523*d6b92ffaSHans Petter Selasky *	the specified number of objects.
524*d6b92ffaSHans Petter Selasky *
525*d6b92ffaSHans Petter Selasky * SYNOPSIS
526*d6b92ffaSHans Petter Selasky */
527*d6b92ffaSHans Petter Selasky static inline cl_status_t
cl_pool_grow(IN cl_pool_t * const p_pool,IN const size_t obj_count)528*d6b92ffaSHans Petter Selasky cl_pool_grow(IN cl_pool_t * const p_pool, IN const size_t obj_count)
529*d6b92ffaSHans Petter Selasky {
530*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_pool);
531*d6b92ffaSHans Petter Selasky 	return (cl_qcpool_grow(&p_pool->qcpool, obj_count));
532*d6b92ffaSHans Petter Selasky }
533*d6b92ffaSHans Petter Selasky 
534*d6b92ffaSHans Petter Selasky /*
535*d6b92ffaSHans Petter Selasky * PARAMETERS
536*d6b92ffaSHans Petter Selasky *	p_pool
537*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_pool_t structure whose capacity to grow.
538*d6b92ffaSHans Petter Selasky *
539*d6b92ffaSHans Petter Selasky *	obj_count
540*d6b92ffaSHans Petter Selasky *		[in] Number of objects by which to grow the pool.
541*d6b92ffaSHans Petter Selasky *
542*d6b92ffaSHans Petter Selasky * RETURN VALUES
543*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the pool grew successfully.
544*d6b92ffaSHans Petter Selasky *
545*d6b92ffaSHans Petter Selasky *	CL_INSUFFICIENT_MEMORY if there was not enough memory to grow the
546*d6b92ffaSHans Petter Selasky *	pool.
547*d6b92ffaSHans Petter Selasky *
548*d6b92ffaSHans Petter Selasky *	cl_status_t value returned by optional initialization callback function
549*d6b92ffaSHans Petter Selasky *	specified by the pfn_initializer parameter passed to the
550*d6b92ffaSHans Petter Selasky *	cl_pool_init function.
551*d6b92ffaSHans Petter Selasky *
552*d6b92ffaSHans Petter Selasky * NOTES
553*d6b92ffaSHans Petter Selasky *	It is not necessary to call cl_pool_grow if the pool is
554*d6b92ffaSHans Petter Selasky *	configured to grow automatically.
555*d6b92ffaSHans Petter Selasky *
556*d6b92ffaSHans Petter Selasky * SEE ALSO
557*d6b92ffaSHans Petter Selasky *	Pool
558*d6b92ffaSHans Petter Selasky *********/
559*d6b92ffaSHans Petter Selasky 
560*d6b92ffaSHans Petter Selasky END_C_DECLS
561*d6b92ffaSHans Petter Selasky #endif				/* _CL_POOL_H_ */
562