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 quick pool.
39*d6b92ffaSHans Petter Selasky * The quick 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_QUICK_POOL_H_
44*d6b92ffaSHans Petter Selasky #define _CL_QUICK_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/Quick Pool
58*d6b92ffaSHans Petter Selasky * NAME
59*d6b92ffaSHans Petter Selasky * Quick Pool
60*d6b92ffaSHans Petter Selasky *
61*d6b92ffaSHans Petter Selasky * DESCRIPTION
62*d6b92ffaSHans Petter Selasky * The quick 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 quick 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 quick 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 quick pool operates on cl_pool_item_t structures that describe
75*d6b92ffaSHans Petter Selasky * objects. This can provides for more efficient memory use and operation.
76*d6b92ffaSHans Petter Selasky * If using a cl_pool_item_t is not desired, the Pool provides similar
77*d6b92ffaSHans Petter Selasky * functionality but operates on opaque objects.
78*d6b92ffaSHans Petter Selasky *
79*d6b92ffaSHans Petter Selasky * The quick pool functions operates on a cl_qpool_t structure which should
80*d6b92ffaSHans Petter Selasky * be treated as opaque and should be manipulated only through the provided
81*d6b92ffaSHans Petter Selasky * functions.
82*d6b92ffaSHans Petter Selasky *
83*d6b92ffaSHans Petter Selasky * SEE ALSO
84*d6b92ffaSHans Petter Selasky * Structures:
85*d6b92ffaSHans Petter Selasky * cl_qpool_t, cl_pool_item_t
86*d6b92ffaSHans Petter Selasky *
87*d6b92ffaSHans Petter Selasky * Callbacks:
88*d6b92ffaSHans Petter Selasky * cl_pfn_qpool_init_t, cl_pfn_qpool_dtor_t
89*d6b92ffaSHans Petter Selasky *
90*d6b92ffaSHans Petter Selasky * Initialization/Destruction:
91*d6b92ffaSHans Petter Selasky * cl_qpool_construct, cl_qpool_init, cl_qpool_destroy
92*d6b92ffaSHans Petter Selasky *
93*d6b92ffaSHans Petter Selasky * Manipulation:
94*d6b92ffaSHans Petter Selasky * cl_qpool_get, cl_qpool_put, cl_qpool_put_list, cl_qpool_grow
95*d6b92ffaSHans Petter Selasky *
96*d6b92ffaSHans Petter Selasky * Attributes:
97*d6b92ffaSHans Petter Selasky * cl_is_qpool_inited, cl_qpool_count
98*d6b92ffaSHans Petter Selasky *********/
99*d6b92ffaSHans Petter Selasky /****d* Component Library: Quick Pool/cl_pfn_qpool_init_t
100*d6b92ffaSHans Petter Selasky * NAME
101*d6b92ffaSHans Petter Selasky * cl_pfn_qpool_init_t
102*d6b92ffaSHans Petter Selasky *
103*d6b92ffaSHans Petter Selasky * DESCRIPTION
104*d6b92ffaSHans Petter Selasky * The cl_pfn_qpool_init_t function type defines the prototype for
105*d6b92ffaSHans Petter Selasky * functions used as constructor for objects being allocated by a
106*d6b92ffaSHans Petter Selasky * quick pool.
107*d6b92ffaSHans Petter Selasky *
108*d6b92ffaSHans Petter Selasky * SYNOPSIS
109*d6b92ffaSHans Petter Selasky */
110*d6b92ffaSHans Petter Selasky typedef cl_status_t
111*d6b92ffaSHans Petter Selasky (*cl_pfn_qpool_init_t) (IN void *const p_object,
112*d6b92ffaSHans Petter Selasky IN void *context,
113*d6b92ffaSHans Petter Selasky OUT cl_pool_item_t ** const pp_pool_item);
114*d6b92ffaSHans Petter Selasky /*
115*d6b92ffaSHans Petter Selasky * PARAMETERS
116*d6b92ffaSHans Petter Selasky * p_object
117*d6b92ffaSHans Petter Selasky * [in] Pointer to an object to initialize.
118*d6b92ffaSHans Petter Selasky *
119*d6b92ffaSHans Petter Selasky * context
120*d6b92ffaSHans Petter Selasky * [in] Context provided in a call to cl_qpool_init.
121*d6b92ffaSHans Petter Selasky *
122*d6b92ffaSHans Petter Selasky * RETURN VALUES
123*d6b92ffaSHans Petter Selasky * Return CL_SUCCESS to indicate that initialization of the object
124*d6b92ffaSHans Petter Selasky * was successful and that initialization of further objects may continue.
125*d6b92ffaSHans Petter Selasky *
126*d6b92ffaSHans Petter Selasky * Other cl_status_t values will be returned by cl_qcpool_init
127*d6b92ffaSHans Petter Selasky * and cl_qcpool_grow.
128*d6b92ffaSHans Petter Selasky *
129*d6b92ffaSHans Petter Selasky * NOTES
130*d6b92ffaSHans Petter Selasky * This function type is provided as function prototype reference for
131*d6b92ffaSHans Petter Selasky * the function provided by the user as an optional parameter to the
132*d6b92ffaSHans Petter Selasky * cl_qpool_init function.
133*d6b92ffaSHans Petter Selasky *
134*d6b92ffaSHans Petter Selasky * The initializer is invoked once per allocated object, allowing the user
135*d6b92ffaSHans Petter Selasky * to perform any necessary initialization. Returning a status other than
136*d6b92ffaSHans Petter Selasky * CL_SUCCESS aborts a grow operation, initiated either through cl_qcpool_init
137*d6b92ffaSHans Petter Selasky * or cl_qcpool_grow, causing the initiating function to fail.
138*d6b92ffaSHans Petter Selasky * Any non-CL_SUCCESS status will be returned by the function that initiated
139*d6b92ffaSHans Petter Selasky * the grow operation.
140*d6b92ffaSHans Petter Selasky *
141*d6b92ffaSHans Petter Selasky * All memory for the object is pre-allocated. Users should include space in
142*d6b92ffaSHans Petter Selasky * their objects for the cl_pool_item_t structure that will represent the
143*d6b92ffaSHans Petter Selasky * object to avoid having to allocate that structure in the initialization
144*d6b92ffaSHans Petter Selasky * callback.
145*d6b92ffaSHans Petter Selasky *
146*d6b92ffaSHans Petter Selasky * When later performing a cl_qcpool_get call, the return value is a pointer
147*d6b92ffaSHans Petter Selasky * to the cl_pool_item_t returned by this function in the pp_pool_item
148*d6b92ffaSHans Petter Selasky * parameter. Users must set pp_pool_item to a valid pointer to the
149*d6b92ffaSHans Petter Selasky * cl_pool_item_t representing the object if they return CL_SUCCESS.
150*d6b92ffaSHans Petter Selasky *
151*d6b92ffaSHans Petter Selasky * SEE ALSO
152*d6b92ffaSHans Petter Selasky * Quick Pool, cl_qpool_init
153*d6b92ffaSHans Petter Selasky *********/
154*d6b92ffaSHans Petter Selasky
155*d6b92ffaSHans Petter Selasky /****d* Component Library: Quick Pool/cl_pfn_qpool_dtor_t
156*d6b92ffaSHans Petter Selasky * NAME
157*d6b92ffaSHans Petter Selasky * cl_pfn_qpool_dtor_t
158*d6b92ffaSHans Petter Selasky *
159*d6b92ffaSHans Petter Selasky * DESCRIPTION
160*d6b92ffaSHans Petter Selasky * The cl_pfn_qpool_dtor_t function type defines the prototype for
161*d6b92ffaSHans Petter Selasky * functions used as destructor for objects being deallocated by a
162*d6b92ffaSHans Petter Selasky * quick pool.
163*d6b92ffaSHans Petter Selasky *
164*d6b92ffaSHans Petter Selasky * SYNOPSIS
165*d6b92ffaSHans Petter Selasky */
166*d6b92ffaSHans Petter Selasky typedef void
167*d6b92ffaSHans Petter Selasky (*cl_pfn_qpool_dtor_t) (IN const cl_pool_item_t * const p_pool_item,
168*d6b92ffaSHans Petter Selasky IN void *context);
169*d6b92ffaSHans Petter Selasky /*
170*d6b92ffaSHans Petter Selasky * PARAMETERS
171*d6b92ffaSHans Petter Selasky * p_pool_item
172*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_pool_item_t structure representing an object.
173*d6b92ffaSHans Petter Selasky *
174*d6b92ffaSHans Petter Selasky * context
175*d6b92ffaSHans Petter Selasky * [in] Context provided in a call to cl_qpool_init.
176*d6b92ffaSHans Petter Selasky *
177*d6b92ffaSHans Petter Selasky * RETURN VALUE
178*d6b92ffaSHans Petter Selasky * This function does not return a value.
179*d6b92ffaSHans Petter Selasky *
180*d6b92ffaSHans Petter Selasky * NOTES
181*d6b92ffaSHans Petter Selasky * This function type is provided as function prototype reference for
182*d6b92ffaSHans Petter Selasky * the function provided by the user as an optional parameter to the
183*d6b92ffaSHans Petter Selasky * cl_qpool_init function.
184*d6b92ffaSHans Petter Selasky *
185*d6b92ffaSHans Petter Selasky * The destructor is invoked once per allocated object, allowing the user
186*d6b92ffaSHans Petter Selasky * to perform any necessary cleanup. Users should not attempt to deallocate
187*d6b92ffaSHans Petter Selasky * the memory for the object, as the quick pool manages object
188*d6b92ffaSHans Petter Selasky * allocation and deallocation.
189*d6b92ffaSHans Petter Selasky *
190*d6b92ffaSHans Petter Selasky * SEE ALSO
191*d6b92ffaSHans Petter Selasky * Quick Pool, cl_qpool_init
192*d6b92ffaSHans Petter Selasky *********/
193*d6b92ffaSHans Petter Selasky
194*d6b92ffaSHans Petter Selasky /****s* Component Library: Quick Pool/cl_qpool_t
195*d6b92ffaSHans Petter Selasky * NAME
196*d6b92ffaSHans Petter Selasky * cl_qpool_t
197*d6b92ffaSHans Petter Selasky *
198*d6b92ffaSHans Petter Selasky * DESCRIPTION
199*d6b92ffaSHans Petter Selasky * Quick pool structure.
200*d6b92ffaSHans Petter Selasky *
201*d6b92ffaSHans Petter Selasky * The cl_qpool_t structure should be treated as opaque and should be
202*d6b92ffaSHans Petter Selasky * manipulated only through the provided functions.
203*d6b92ffaSHans Petter Selasky *
204*d6b92ffaSHans Petter Selasky * SYNOPSIS
205*d6b92ffaSHans Petter Selasky */
206*d6b92ffaSHans Petter Selasky typedef struct _cl_qpool {
207*d6b92ffaSHans Petter Selasky cl_qcpool_t qcpool;
208*d6b92ffaSHans Petter Selasky cl_pfn_qpool_init_t pfn_init;
209*d6b92ffaSHans Petter Selasky cl_pfn_qpool_dtor_t pfn_dtor;
210*d6b92ffaSHans Petter Selasky const void *context;
211*d6b92ffaSHans Petter Selasky } cl_qpool_t;
212*d6b92ffaSHans Petter Selasky /*
213*d6b92ffaSHans Petter Selasky * FIELDS
214*d6b92ffaSHans Petter Selasky * qcpool
215*d6b92ffaSHans Petter Selasky * Quick composite pool that manages all objects.
216*d6b92ffaSHans Petter Selasky *
217*d6b92ffaSHans Petter Selasky * pfn_init
218*d6b92ffaSHans Petter Selasky * Pointer to the user's initializer callback, used by the pool
219*d6b92ffaSHans Petter Selasky * to translate the quick composite pool's initializer callback to
220*d6b92ffaSHans Petter Selasky * a quick pool initializer callback.
221*d6b92ffaSHans Petter Selasky *
222*d6b92ffaSHans Petter Selasky * pfn_dtor
223*d6b92ffaSHans Petter Selasky * Pointer to the user's destructor callback, used by the pool
224*d6b92ffaSHans Petter Selasky * to translate the quick composite pool's destructor callback to
225*d6b92ffaSHans Petter Selasky * a quick pool destructor callback.
226*d6b92ffaSHans Petter Selasky *
227*d6b92ffaSHans Petter Selasky * context
228*d6b92ffaSHans Petter Selasky * User's provided context for callback functions, used by the pool
229*d6b92ffaSHans Petter Selasky * to when invoking callbacks.
230*d6b92ffaSHans Petter Selasky *
231*d6b92ffaSHans Petter Selasky * SEE ALSO
232*d6b92ffaSHans Petter Selasky * Quick Pool
233*d6b92ffaSHans Petter Selasky *********/
234*d6b92ffaSHans Petter Selasky
235*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Pool/cl_qpool_construct
236*d6b92ffaSHans Petter Selasky * NAME
237*d6b92ffaSHans Petter Selasky * cl_qpool_construct
238*d6b92ffaSHans Petter Selasky *
239*d6b92ffaSHans Petter Selasky * DESCRIPTION
240*d6b92ffaSHans Petter Selasky * The cl_qpool_construct function constructs a quick pool.
241*d6b92ffaSHans Petter Selasky *
242*d6b92ffaSHans Petter Selasky * SYNOPSIS
243*d6b92ffaSHans Petter Selasky */
244*d6b92ffaSHans Petter Selasky void cl_qpool_construct(IN cl_qpool_t * const p_pool);
245*d6b92ffaSHans Petter Selasky /*
246*d6b92ffaSHans Petter Selasky * PARAMETERS
247*d6b92ffaSHans Petter Selasky * p_pool
248*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qpool_t structure whose state to initialize.
249*d6b92ffaSHans Petter Selasky *
250*d6b92ffaSHans Petter Selasky * RETURN VALUE
251*d6b92ffaSHans Petter Selasky * This function does not return a value.
252*d6b92ffaSHans Petter Selasky *
253*d6b92ffaSHans Petter Selasky * NOTES
254*d6b92ffaSHans Petter Selasky * Allows calling cl_qpool_init, cl_qpool_destroy, cl_is_qpool_inited.
255*d6b92ffaSHans Petter Selasky *
256*d6b92ffaSHans Petter Selasky * Calling cl_qpool_construct is a prerequisite to calling any other
257*d6b92ffaSHans Petter Selasky * quick pool function except cl_pool_init.
258*d6b92ffaSHans Petter Selasky *
259*d6b92ffaSHans Petter Selasky * SEE ALSO
260*d6b92ffaSHans Petter Selasky * Quick Pool, cl_qpool_init, cl_qpool_destroy, cl_is_qpool_inited.
261*d6b92ffaSHans Petter Selasky *********/
262*d6b92ffaSHans Petter Selasky
263*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Pool/cl_is_qpool_inited
264*d6b92ffaSHans Petter Selasky * NAME
265*d6b92ffaSHans Petter Selasky * cl_is_qpool_inited
266*d6b92ffaSHans Petter Selasky *
267*d6b92ffaSHans Petter Selasky * DESCRIPTION
268*d6b92ffaSHans Petter Selasky * The cl_is_qpool_inited function returns whether a quick pool was
269*d6b92ffaSHans Petter Selasky * successfully initialized.
270*d6b92ffaSHans Petter Selasky *
271*d6b92ffaSHans Petter Selasky * SYNOPSIS
272*d6b92ffaSHans Petter Selasky */
cl_is_qpool_inited(IN const cl_qpool_t * const p_pool)273*d6b92ffaSHans Petter Selasky static inline uint32_t cl_is_qpool_inited(IN const cl_qpool_t * const p_pool)
274*d6b92ffaSHans Petter Selasky {
275*d6b92ffaSHans Petter Selasky /* CL_ASSERT that a non-null pointer is provided. */
276*d6b92ffaSHans Petter Selasky CL_ASSERT(p_pool);
277*d6b92ffaSHans Petter Selasky return (cl_is_qcpool_inited(&p_pool->qcpool));
278*d6b92ffaSHans Petter Selasky }
279*d6b92ffaSHans Petter Selasky
280*d6b92ffaSHans Petter Selasky /*
281*d6b92ffaSHans Petter Selasky * PARAMETERS
282*d6b92ffaSHans Petter Selasky * p_pool
283*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qpool_t structure whose initialization state
284*d6b92ffaSHans Petter Selasky * to check.
285*d6b92ffaSHans Petter Selasky *
286*d6b92ffaSHans Petter Selasky * RETURN VALUES
287*d6b92ffaSHans Petter Selasky * TRUE if the quick pool was initialized successfully.
288*d6b92ffaSHans Petter Selasky *
289*d6b92ffaSHans Petter Selasky * FALSE otherwise.
290*d6b92ffaSHans Petter Selasky *
291*d6b92ffaSHans Petter Selasky * NOTES
292*d6b92ffaSHans Petter Selasky * Allows checking the state of a quick pool to determine if
293*d6b92ffaSHans Petter Selasky * invoking member functions is appropriate.
294*d6b92ffaSHans Petter Selasky *
295*d6b92ffaSHans Petter Selasky * SEE ALSO
296*d6b92ffaSHans Petter Selasky * Quick Pool
297*d6b92ffaSHans Petter Selasky *********/
298*d6b92ffaSHans Petter Selasky
299*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Pool/cl_qpool_init
300*d6b92ffaSHans Petter Selasky * NAME
301*d6b92ffaSHans Petter Selasky * cl_qpool_init
302*d6b92ffaSHans Petter Selasky *
303*d6b92ffaSHans Petter Selasky * DESCRIPTION
304*d6b92ffaSHans Petter Selasky * The cl_qpool_init function initializes a quick pool for use.
305*d6b92ffaSHans Petter Selasky *
306*d6b92ffaSHans Petter Selasky * SYNOPSIS
307*d6b92ffaSHans Petter Selasky */
308*d6b92ffaSHans Petter Selasky cl_status_t
309*d6b92ffaSHans Petter Selasky cl_qpool_init(IN cl_qpool_t * const p_pool,
310*d6b92ffaSHans Petter Selasky IN const size_t min_size,
311*d6b92ffaSHans Petter Selasky IN const size_t max_size,
312*d6b92ffaSHans Petter Selasky IN const size_t grow_size,
313*d6b92ffaSHans Petter Selasky IN const size_t object_size,
314*d6b92ffaSHans Petter Selasky IN cl_pfn_qpool_init_t pfn_initializer OPTIONAL,
315*d6b92ffaSHans Petter Selasky IN cl_pfn_qpool_dtor_t pfn_destructor OPTIONAL,
316*d6b92ffaSHans Petter Selasky IN const void *const context);
317*d6b92ffaSHans Petter Selasky /*
318*d6b92ffaSHans Petter Selasky * PARAMETERS
319*d6b92ffaSHans Petter Selasky * p_pool
320*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qpool_t structure to initialize.
321*d6b92ffaSHans Petter Selasky *
322*d6b92ffaSHans Petter Selasky * min_size
323*d6b92ffaSHans Petter Selasky * [in] Minimum number of objects that the pool should support. All
324*d6b92ffaSHans Petter Selasky * necessary allocations to allow storing the minimum number of items
325*d6b92ffaSHans Petter Selasky * are performed at initialization time, and all necessary callbacks
326*d6b92ffaSHans Petter Selasky * successfully invoked.
327*d6b92ffaSHans Petter Selasky *
328*d6b92ffaSHans Petter Selasky * max_size
329*d6b92ffaSHans Petter Selasky * [in] Maximum number of objects to which the pool is allowed to grow.
330*d6b92ffaSHans Petter Selasky * A value of zero specifies no maximum.
331*d6b92ffaSHans Petter Selasky *
332*d6b92ffaSHans Petter Selasky * grow_size
333*d6b92ffaSHans Petter Selasky * [in] Number of objects to allocate when incrementally growing the pool.
334*d6b92ffaSHans Petter Selasky * A value of zero disables automatic growth.
335*d6b92ffaSHans Petter Selasky *
336*d6b92ffaSHans Petter Selasky * object_size
337*d6b92ffaSHans Petter Selasky * [in] Size, in bytes, of each object.
338*d6b92ffaSHans Petter Selasky *
339*d6b92ffaSHans Petter Selasky * pfn_initializer
340*d6b92ffaSHans Petter Selasky * [in] Initialization callback to invoke for every new object when
341*d6b92ffaSHans Petter Selasky * growing the pool. This parameter is optional and may be NULL. If NULL,
342*d6b92ffaSHans Petter Selasky * the pool assumes the cl_pool_item_t structure describing objects is
343*d6b92ffaSHans Petter Selasky * located at the head of each object. See the cl_pfn_qpool_init_t
344*d6b92ffaSHans Petter Selasky * function type declaration for details about the callback function.
345*d6b92ffaSHans Petter Selasky *
346*d6b92ffaSHans Petter Selasky * pfn_destructor
347*d6b92ffaSHans Petter Selasky * [in] Destructor callback to invoke for every object before memory for
348*d6b92ffaSHans Petter Selasky * that object is freed. This parameter is optional and may be NULL.
349*d6b92ffaSHans Petter Selasky * See the cl_pfn_qpool_dtor_t function type declaration for details
350*d6b92ffaSHans Petter Selasky * about the callback function.
351*d6b92ffaSHans Petter Selasky *
352*d6b92ffaSHans Petter Selasky * context
353*d6b92ffaSHans Petter Selasky * [in] Value to pass to the callback functions to provide context.
354*d6b92ffaSHans Petter Selasky *
355*d6b92ffaSHans Petter Selasky * RETURN VALUES
356*d6b92ffaSHans Petter Selasky * CL_SUCCESS if the quick pool was initialized successfully.
357*d6b92ffaSHans Petter Selasky *
358*d6b92ffaSHans Petter Selasky * CL_INSUFFICIENT_MEMORY if there was not enough memory to initialize the
359*d6b92ffaSHans Petter Selasky * quick pool.
360*d6b92ffaSHans Petter Selasky *
361*d6b92ffaSHans Petter Selasky * CL_INVALID_SETTING if a the maximum size is non-zero and less than the
362*d6b92ffaSHans Petter Selasky * minimum size.
363*d6b92ffaSHans Petter Selasky *
364*d6b92ffaSHans Petter Selasky * Other cl_status_t value returned by optional initialization callback function
365*d6b92ffaSHans Petter Selasky * specified by the pfn_initializer parameter.
366*d6b92ffaSHans Petter Selasky *
367*d6b92ffaSHans Petter Selasky * NOTES
368*d6b92ffaSHans Petter Selasky * cl_qpool_init initializes, and if necessary, grows the pool to
369*d6b92ffaSHans Petter Selasky * the capacity desired.
370*d6b92ffaSHans Petter Selasky *
371*d6b92ffaSHans Petter Selasky * SEE ALSO
372*d6b92ffaSHans Petter Selasky * Quick Pool, cl_qpool_construct, cl_qpool_destroy,
373*d6b92ffaSHans Petter Selasky * cl_qpool_get, cl_qpool_put, cl_qpool_grow,
374*d6b92ffaSHans Petter Selasky * cl_qpool_count, cl_pfn_qpool_init_t, cl_pfn_qpool_init_t,
375*d6b92ffaSHans Petter Selasky * cl_pfn_qpool_dtor_t
376*d6b92ffaSHans Petter Selasky *********/
377*d6b92ffaSHans Petter Selasky
378*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Pool/cl_qpool_destroy
379*d6b92ffaSHans Petter Selasky * NAME
380*d6b92ffaSHans Petter Selasky * cl_qpool_destroy
381*d6b92ffaSHans Petter Selasky *
382*d6b92ffaSHans Petter Selasky * DESCRIPTION
383*d6b92ffaSHans Petter Selasky * The cl_qpool_destroy function destroys a quick pool.
384*d6b92ffaSHans Petter Selasky *
385*d6b92ffaSHans Petter Selasky * SYNOPSIS
386*d6b92ffaSHans Petter Selasky */
cl_qpool_destroy(IN cl_qpool_t * const p_pool)387*d6b92ffaSHans Petter Selasky static inline void cl_qpool_destroy(IN cl_qpool_t * const p_pool)
388*d6b92ffaSHans Petter Selasky {
389*d6b92ffaSHans Petter Selasky CL_ASSERT(p_pool);
390*d6b92ffaSHans Petter Selasky cl_qcpool_destroy(&p_pool->qcpool);
391*d6b92ffaSHans Petter Selasky }
392*d6b92ffaSHans Petter Selasky
393*d6b92ffaSHans Petter Selasky /*
394*d6b92ffaSHans Petter Selasky * PARAMETERS
395*d6b92ffaSHans Petter Selasky * p_pool
396*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qpool_t structure to destroy.
397*d6b92ffaSHans Petter Selasky *
398*d6b92ffaSHans Petter Selasky * RETURN VALUE
399*d6b92ffaSHans Petter Selasky * This function does not return a value.
400*d6b92ffaSHans Petter Selasky *
401*d6b92ffaSHans Petter Selasky * NOTES
402*d6b92ffaSHans Petter Selasky * All memory allocated for objects is freed. The destructor callback,
403*d6b92ffaSHans Petter Selasky * if any, will be invoked for every allocated object. Further operations
404*d6b92ffaSHans Petter Selasky * on the pool should not be attempted after cl_qpool_destroy
405*d6b92ffaSHans Petter Selasky * is invoked.
406*d6b92ffaSHans Petter Selasky *
407*d6b92ffaSHans Petter Selasky * This function should only be called after a call to
408*d6b92ffaSHans Petter Selasky * cl_qpool_construct or cl_qpool_init.
409*d6b92ffaSHans Petter Selasky *
410*d6b92ffaSHans Petter Selasky * In a debug build, cl_qpool_destroy asserts that all objects are in
411*d6b92ffaSHans Petter Selasky * the pool.
412*d6b92ffaSHans Petter Selasky *
413*d6b92ffaSHans Petter Selasky * SEE ALSO
414*d6b92ffaSHans Petter Selasky * Quick Pool, cl_qpool_construct, cl_qpool_init
415*d6b92ffaSHans Petter Selasky *********/
416*d6b92ffaSHans Petter Selasky
417*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Pool/cl_qpool_count
418*d6b92ffaSHans Petter Selasky * NAME
419*d6b92ffaSHans Petter Selasky * cl_qpool_count
420*d6b92ffaSHans Petter Selasky *
421*d6b92ffaSHans Petter Selasky * DESCRIPTION
422*d6b92ffaSHans Petter Selasky * The cl_qpool_count function returns the number of available objects
423*d6b92ffaSHans Petter Selasky * in a quick pool.
424*d6b92ffaSHans Petter Selasky *
425*d6b92ffaSHans Petter Selasky * SYNOPSIS
426*d6b92ffaSHans Petter Selasky */
cl_qpool_count(IN cl_qpool_t * const p_pool)427*d6b92ffaSHans Petter Selasky static inline size_t cl_qpool_count(IN cl_qpool_t * const p_pool)
428*d6b92ffaSHans Petter Selasky {
429*d6b92ffaSHans Petter Selasky CL_ASSERT(p_pool);
430*d6b92ffaSHans Petter Selasky return (cl_qcpool_count(&p_pool->qcpool));
431*d6b92ffaSHans Petter Selasky }
432*d6b92ffaSHans Petter Selasky
433*d6b92ffaSHans Petter Selasky /*
434*d6b92ffaSHans Petter Selasky * PARAMETERS
435*d6b92ffaSHans Petter Selasky * p_pool
436*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qpool_t structure for which the number of
437*d6b92ffaSHans Petter Selasky * available objects is requested.
438*d6b92ffaSHans Petter Selasky *
439*d6b92ffaSHans Petter Selasky * RETURN VALUE
440*d6b92ffaSHans Petter Selasky * Returns the number of objects available in the specified quick pool.
441*d6b92ffaSHans Petter Selasky *
442*d6b92ffaSHans Petter Selasky * SEE ALSO
443*d6b92ffaSHans Petter Selasky * Quick Pool
444*d6b92ffaSHans Petter Selasky *********/
445*d6b92ffaSHans Petter Selasky
446*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Pool/cl_qpool_get
447*d6b92ffaSHans Petter Selasky * NAME
448*d6b92ffaSHans Petter Selasky * cl_qpool_get
449*d6b92ffaSHans Petter Selasky *
450*d6b92ffaSHans Petter Selasky * DESCRIPTION
451*d6b92ffaSHans Petter Selasky * The cl_qpool_get function retrieves an object from a
452*d6b92ffaSHans Petter Selasky * quick pool.
453*d6b92ffaSHans Petter Selasky *
454*d6b92ffaSHans Petter Selasky * SYNOPSIS
455*d6b92ffaSHans Petter Selasky */
cl_qpool_get(IN cl_qpool_t * const p_pool)456*d6b92ffaSHans Petter Selasky static inline cl_pool_item_t *cl_qpool_get(IN cl_qpool_t * const p_pool)
457*d6b92ffaSHans Petter Selasky {
458*d6b92ffaSHans Petter Selasky CL_ASSERT(p_pool);
459*d6b92ffaSHans Petter Selasky return (cl_qcpool_get(&p_pool->qcpool));
460*d6b92ffaSHans Petter Selasky }
461*d6b92ffaSHans Petter Selasky
462*d6b92ffaSHans Petter Selasky /*
463*d6b92ffaSHans Petter Selasky * PARAMETERS
464*d6b92ffaSHans Petter Selasky * p_pool
465*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qpool_t structure from which to retrieve
466*d6b92ffaSHans Petter Selasky * an object.
467*d6b92ffaSHans Petter Selasky *
468*d6b92ffaSHans Petter Selasky * RETURN VALUES
469*d6b92ffaSHans Petter Selasky * Returns a pointer to a cl_pool_item_t for an object.
470*d6b92ffaSHans Petter Selasky *
471*d6b92ffaSHans Petter Selasky * Returns NULL if the pool is empty and can not be grown automatically.
472*d6b92ffaSHans Petter Selasky *
473*d6b92ffaSHans Petter Selasky * NOTES
474*d6b92ffaSHans Petter Selasky * cl_qpool_get returns the object at the head of the pool. If the pool is
475*d6b92ffaSHans Petter Selasky * empty, it is automatically grown to accommodate this request unless the
476*d6b92ffaSHans Petter Selasky * grow_size parameter passed to the cl_qpool_init function was zero.
477*d6b92ffaSHans Petter Selasky *
478*d6b92ffaSHans Petter Selasky * SEE ALSO
479*d6b92ffaSHans Petter Selasky * Quick Pool, cl_qpool_get_tail, cl_qpool_put, cl_qpool_grow, cl_qpool_count
480*d6b92ffaSHans Petter Selasky *********/
481*d6b92ffaSHans Petter Selasky
482*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Pool/cl_qpool_put
483*d6b92ffaSHans Petter Selasky * NAME
484*d6b92ffaSHans Petter Selasky * cl_qpool_put
485*d6b92ffaSHans Petter Selasky *
486*d6b92ffaSHans Petter Selasky * DESCRIPTION
487*d6b92ffaSHans Petter Selasky * The cl_qpool_put function returns an object to the head of a quick pool.
488*d6b92ffaSHans Petter Selasky *
489*d6b92ffaSHans Petter Selasky * SYNOPSIS
490*d6b92ffaSHans Petter Selasky */
491*d6b92ffaSHans Petter Selasky static inline void
cl_qpool_put(IN cl_qpool_t * const p_pool,IN cl_pool_item_t * const p_pool_item)492*d6b92ffaSHans Petter Selasky cl_qpool_put(IN cl_qpool_t * const p_pool,
493*d6b92ffaSHans Petter Selasky IN cl_pool_item_t * const p_pool_item)
494*d6b92ffaSHans Petter Selasky {
495*d6b92ffaSHans Petter Selasky CL_ASSERT(p_pool);
496*d6b92ffaSHans Petter Selasky cl_qcpool_put(&p_pool->qcpool, p_pool_item);
497*d6b92ffaSHans Petter Selasky }
498*d6b92ffaSHans Petter Selasky
499*d6b92ffaSHans Petter Selasky /*
500*d6b92ffaSHans Petter Selasky * PARAMETERS
501*d6b92ffaSHans Petter Selasky * p_pool
502*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qpool_t structure to which to return
503*d6b92ffaSHans Petter Selasky * an object.
504*d6b92ffaSHans Petter Selasky *
505*d6b92ffaSHans Petter Selasky * p_pool_item
506*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_pool_item_t structure for the object
507*d6b92ffaSHans Petter Selasky * being returned.
508*d6b92ffaSHans Petter Selasky *
509*d6b92ffaSHans Petter Selasky * RETURN VALUE
510*d6b92ffaSHans Petter Selasky * This function does not return a value.
511*d6b92ffaSHans Petter Selasky *
512*d6b92ffaSHans Petter Selasky * NOTES
513*d6b92ffaSHans Petter Selasky * cl_qpool_put places the returned object at the head of the pool.
514*d6b92ffaSHans Petter Selasky *
515*d6b92ffaSHans Petter Selasky * The object specified by the p_pool_item parameter must have been
516*d6b92ffaSHans Petter Selasky * retrieved from the pool by a previous call to cl_qpool_get.
517*d6b92ffaSHans Petter Selasky *
518*d6b92ffaSHans Petter Selasky * SEE ALSO
519*d6b92ffaSHans Petter Selasky * Quick Pool, cl_qpool_put_tail, cl_qpool_get
520*d6b92ffaSHans Petter Selasky *********/
521*d6b92ffaSHans Petter Selasky
522*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Pool/cl_qpool_put_list
523*d6b92ffaSHans Petter Selasky * NAME
524*d6b92ffaSHans Petter Selasky * cl_qpool_put_list
525*d6b92ffaSHans Petter Selasky *
526*d6b92ffaSHans Petter Selasky * DESCRIPTION
527*d6b92ffaSHans Petter Selasky * The cl_qpool_put_list function returns a list of objects to the head
528*d6b92ffaSHans Petter Selasky * of a quick pool.
529*d6b92ffaSHans Petter Selasky *
530*d6b92ffaSHans Petter Selasky * SYNOPSIS
531*d6b92ffaSHans Petter Selasky */
532*d6b92ffaSHans Petter Selasky static inline void
cl_qpool_put_list(IN cl_qpool_t * const p_pool,IN cl_qlist_t * const p_list)533*d6b92ffaSHans Petter Selasky cl_qpool_put_list(IN cl_qpool_t * const p_pool, IN cl_qlist_t * const p_list)
534*d6b92ffaSHans Petter Selasky {
535*d6b92ffaSHans Petter Selasky CL_ASSERT(p_pool);
536*d6b92ffaSHans Petter Selasky cl_qcpool_put_list(&p_pool->qcpool, p_list);
537*d6b92ffaSHans Petter Selasky }
538*d6b92ffaSHans Petter Selasky
539*d6b92ffaSHans Petter Selasky /*
540*d6b92ffaSHans Petter Selasky * PARAMETERS
541*d6b92ffaSHans Petter Selasky * p_pool
542*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qpool_t structure to which to return
543*d6b92ffaSHans Petter Selasky * a list of objects.
544*d6b92ffaSHans Petter Selasky *
545*d6b92ffaSHans Petter Selasky * p_list
546*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qlist_t structure for the list of objects
547*d6b92ffaSHans Petter Selasky * being returned.
548*d6b92ffaSHans Petter Selasky *
549*d6b92ffaSHans Petter Selasky * RETURN VALUE
550*d6b92ffaSHans Petter Selasky * This function does not return a value.
551*d6b92ffaSHans Petter Selasky *
552*d6b92ffaSHans Petter Selasky * NOTES
553*d6b92ffaSHans Petter Selasky * cl_qpool_put_list places the returned objects at the head of the pool.
554*d6b92ffaSHans Petter Selasky *
555*d6b92ffaSHans Petter Selasky * The objects in the list specified by the p_list parameter must have been
556*d6b92ffaSHans Petter Selasky * retrieved from the pool by a previous call to cl_qpool_get.
557*d6b92ffaSHans Petter Selasky *
558*d6b92ffaSHans Petter Selasky * SEE ALSO
559*d6b92ffaSHans Petter Selasky * Quick Pool, cl_qpool_put, cl_qpool_put_tail, cl_qpool_get
560*d6b92ffaSHans Petter Selasky *********/
561*d6b92ffaSHans Petter Selasky
562*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Pool/cl_qpool_grow
563*d6b92ffaSHans Petter Selasky * NAME
564*d6b92ffaSHans Petter Selasky * cl_qpool_grow
565*d6b92ffaSHans Petter Selasky *
566*d6b92ffaSHans Petter Selasky * DESCRIPTION
567*d6b92ffaSHans Petter Selasky * The cl_qpool_grow function grows a quick pool by
568*d6b92ffaSHans Petter Selasky * the specified number of objects.
569*d6b92ffaSHans Petter Selasky *
570*d6b92ffaSHans Petter Selasky * SYNOPSIS
571*d6b92ffaSHans Petter Selasky */
572*d6b92ffaSHans Petter Selasky static inline cl_status_t
cl_qpool_grow(IN cl_qpool_t * const p_pool,IN const size_t obj_count)573*d6b92ffaSHans Petter Selasky cl_qpool_grow(IN cl_qpool_t * const p_pool, IN const size_t obj_count)
574*d6b92ffaSHans Petter Selasky {
575*d6b92ffaSHans Petter Selasky CL_ASSERT(p_pool);
576*d6b92ffaSHans Petter Selasky return (cl_qcpool_grow(&p_pool->qcpool, obj_count));
577*d6b92ffaSHans Petter Selasky }
578*d6b92ffaSHans Petter Selasky
579*d6b92ffaSHans Petter Selasky /*
580*d6b92ffaSHans Petter Selasky * PARAMETERS
581*d6b92ffaSHans Petter Selasky * p_pool
582*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qpool_t structure whose capacity to grow.
583*d6b92ffaSHans Petter Selasky *
584*d6b92ffaSHans Petter Selasky * obj_count
585*d6b92ffaSHans Petter Selasky * [in] Number of objects by which to grow the pool.
586*d6b92ffaSHans Petter Selasky *
587*d6b92ffaSHans Petter Selasky * RETURN VALUES
588*d6b92ffaSHans Petter Selasky * CL_SUCCESS if the quick pool grew successfully.
589*d6b92ffaSHans Petter Selasky *
590*d6b92ffaSHans Petter Selasky * CL_INSUFFICIENT_MEMORY if there was not enough memory to grow the
591*d6b92ffaSHans Petter Selasky * quick pool.
592*d6b92ffaSHans Petter Selasky *
593*d6b92ffaSHans Petter Selasky * cl_status_t value returned by optional initialization callback function
594*d6b92ffaSHans Petter Selasky * specified by the pfn_initializer parameter passed to the
595*d6b92ffaSHans Petter Selasky * cl_qpool_init function.
596*d6b92ffaSHans Petter Selasky *
597*d6b92ffaSHans Petter Selasky * NOTES
598*d6b92ffaSHans Petter Selasky * It is not necessary to call cl_qpool_grow if the pool is
599*d6b92ffaSHans Petter Selasky * configured to grow automatically.
600*d6b92ffaSHans Petter Selasky *
601*d6b92ffaSHans Petter Selasky * SEE ALSO
602*d6b92ffaSHans Petter Selasky * Quick Pool
603*d6b92ffaSHans Petter Selasky *********/
604*d6b92ffaSHans Petter Selasky
605*d6b92ffaSHans Petter Selasky END_C_DECLS
606*d6b92ffaSHans Petter Selasky #endif /* _CL_QUICK_POOL_H_ */
607