xref: /freebsd-src/contrib/ofed/opensm/include/complib/cl_threadpool.h (revision 87181516ef48be852d5e5fee53c6e0dbfc62f21e)
1*d6b92ffaSHans Petter Selasky /*
2*d6b92ffaSHans Petter Selasky  * Copyright (c) 2004-2007 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 thread pool.
39*d6b92ffaSHans Petter Selasky  */
40*d6b92ffaSHans Petter Selasky 
41*d6b92ffaSHans Petter Selasky #ifndef _CL_THREAD_POOL_H_
42*d6b92ffaSHans Petter Selasky #define _CL_THREAD_POOL_H_
43*d6b92ffaSHans Petter Selasky 
44*d6b92ffaSHans Petter Selasky #include <pthread.h>
45*d6b92ffaSHans Petter Selasky #include <complib/cl_types.h>
46*d6b92ffaSHans Petter Selasky #include <complib/cl_thread.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/Thread Pool
58*d6b92ffaSHans Petter Selasky * NAME
59*d6b92ffaSHans Petter Selasky *	Thread Pool
60*d6b92ffaSHans Petter Selasky *
61*d6b92ffaSHans Petter Selasky * DESCRIPTION
62*d6b92ffaSHans Petter Selasky *	The Thread Pool manages a user specified number of threads.
63*d6b92ffaSHans Petter Selasky *
64*d6b92ffaSHans Petter Selasky *	Each thread in the thread pool waits for a user initiated signal before
65*d6b92ffaSHans Petter Selasky *	invoking a user specified callback function. All threads in the thread
66*d6b92ffaSHans Petter Selasky *	pool invoke the same callback function.
67*d6b92ffaSHans Petter Selasky *
68*d6b92ffaSHans Petter Selasky *	The thread pool functions operate on a cl_thread_pool_t structure which
69*d6b92ffaSHans Petter Selasky *	should be treated as opaque, and should be manipulated only through the
70*d6b92ffaSHans Petter Selasky *	provided functions.
71*d6b92ffaSHans Petter Selasky *
72*d6b92ffaSHans Petter Selasky * SEE ALSO
73*d6b92ffaSHans Petter Selasky *	Structures:
74*d6b92ffaSHans Petter Selasky *		cl_thread_pool_t
75*d6b92ffaSHans Petter Selasky *
76*d6b92ffaSHans Petter Selasky *	Initialization:
77*d6b92ffaSHans Petter Selasky *		cl_thread_pool_init, cl_thread_pool_destroy
78*d6b92ffaSHans Petter Selasky *
79*d6b92ffaSHans Petter Selasky *	Manipulation
80*d6b92ffaSHans Petter Selasky *		cl_thread_pool_signal
81*d6b92ffaSHans Petter Selasky *********/
82*d6b92ffaSHans Petter Selasky /****s* Component Library: Thread Pool/cl_thread_pool_t
83*d6b92ffaSHans Petter Selasky * NAME
84*d6b92ffaSHans Petter Selasky *	cl_thread_pool_t
85*d6b92ffaSHans Petter Selasky *
86*d6b92ffaSHans Petter Selasky * DESCRIPTION
87*d6b92ffaSHans Petter Selasky *	Thread pool structure.
88*d6b92ffaSHans Petter Selasky *
89*d6b92ffaSHans Petter Selasky *	The cl_thread_pool_t structure should be treated as opaque, and should be
90*d6b92ffaSHans Petter Selasky *	manipulated only through the provided functions.
91*d6b92ffaSHans Petter Selasky *
92*d6b92ffaSHans Petter Selasky * SYNOPSIS
93*d6b92ffaSHans Petter Selasky */
94*d6b92ffaSHans Petter Selasky typedef struct _cl_thread_pool {
95*d6b92ffaSHans Petter Selasky 	void (*pfn_callback) (void *);
96*d6b92ffaSHans Petter Selasky 	void *context;
97*d6b92ffaSHans Petter Selasky 	unsigned running_count;
98*d6b92ffaSHans Petter Selasky 	unsigned events;
99*d6b92ffaSHans Petter Selasky 	pthread_cond_t cond;
100*d6b92ffaSHans Petter Selasky 	pthread_mutex_t mutex;
101*d6b92ffaSHans Petter Selasky 	pthread_t *tid;
102*d6b92ffaSHans Petter Selasky } cl_thread_pool_t;
103*d6b92ffaSHans Petter Selasky /*
104*d6b92ffaSHans Petter Selasky * FIELDS
105*d6b92ffaSHans Petter Selasky *	pfn_callback
106*d6b92ffaSHans Petter Selasky *		Callback function for the thread to invoke.
107*d6b92ffaSHans Petter Selasky *
108*d6b92ffaSHans Petter Selasky *	context
109*d6b92ffaSHans Petter Selasky *		Context to pass to the thread callback function.
110*d6b92ffaSHans Petter Selasky *
111*d6b92ffaSHans Petter Selasky *	running_count
112*d6b92ffaSHans Petter Selasky *		Number of threads running.
113*d6b92ffaSHans Petter Selasky *
114*d6b92ffaSHans Petter Selasky *	events
115*d6b92ffaSHans Petter Selasky *		events counter
116*d6b92ffaSHans Petter Selasky *
117*d6b92ffaSHans Petter Selasky *	mutex
118*d6b92ffaSHans Petter Selasky *		mutex for cond variable protection
119*d6b92ffaSHans Petter Selasky *
120*d6b92ffaSHans Petter Selasky *	cond
121*d6b92ffaSHans Petter Selasky *		conditional variable to signal an event to thread
122*d6b92ffaSHans Petter Selasky *
123*d6b92ffaSHans Petter Selasky *	tid
124*d6b92ffaSHans Petter Selasky *		array of allocated thread ids.
125*d6b92ffaSHans Petter Selasky *
126*d6b92ffaSHans Petter Selasky * SEE ALSO
127*d6b92ffaSHans Petter Selasky *	Thread Pool
128*d6b92ffaSHans Petter Selasky *********/
129*d6b92ffaSHans Petter Selasky 
130*d6b92ffaSHans Petter Selasky /****f* Component Library: Thread Pool/cl_thread_pool_init
131*d6b92ffaSHans Petter Selasky * NAME
132*d6b92ffaSHans Petter Selasky *	cl_thread_pool_init
133*d6b92ffaSHans Petter Selasky *
134*d6b92ffaSHans Petter Selasky * DESCRIPTION
135*d6b92ffaSHans Petter Selasky *	The cl_thread_pool_init function creates the threads to be
136*d6b92ffaSHans Petter Selasky *	managed by a thread pool.
137*d6b92ffaSHans Petter Selasky *
138*d6b92ffaSHans Petter Selasky * SYNOPSIS
139*d6b92ffaSHans Petter Selasky */
140*d6b92ffaSHans Petter Selasky cl_status_t
141*d6b92ffaSHans Petter Selasky cl_thread_pool_init(IN cl_thread_pool_t * const p_thread_pool,
142*d6b92ffaSHans Petter Selasky 		    IN unsigned count,
143*d6b92ffaSHans Petter Selasky 		    IN void (*pfn_callback) (void *),
144*d6b92ffaSHans Petter Selasky 		    IN void *context, IN const char *const name);
145*d6b92ffaSHans Petter Selasky /*
146*d6b92ffaSHans Petter Selasky * PARAMETERS
147*d6b92ffaSHans Petter Selasky *	p_thread_pool
148*d6b92ffaSHans Petter Selasky *		[in] Pointer to a thread pool structure to initialize.
149*d6b92ffaSHans Petter Selasky *
150*d6b92ffaSHans Petter Selasky *	thread_count
151*d6b92ffaSHans Petter Selasky *		[in] Number of threads to be managed by the thread pool.
152*d6b92ffaSHans Petter Selasky *
153*d6b92ffaSHans Petter Selasky *	pfn_callback
154*d6b92ffaSHans Petter Selasky *		[in] Address of a function to be invoked by a thread.
155*d6b92ffaSHans Petter Selasky *		See the cl_pfn_thread_callback_t function type definition for
156*d6b92ffaSHans Petter Selasky *		details about the callback function.
157*d6b92ffaSHans Petter Selasky *
158*d6b92ffaSHans Petter Selasky *	context
159*d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback function.
160*d6b92ffaSHans Petter Selasky *
161*d6b92ffaSHans Petter Selasky *	name
162*d6b92ffaSHans Petter Selasky *		[in] Name to associate with the threads.  The name may be up to 16
163*d6b92ffaSHans Petter Selasky *		characters, including a terminating null character.  All threads
164*d6b92ffaSHans Petter Selasky *		created in the pool have the same name.
165*d6b92ffaSHans Petter Selasky *
166*d6b92ffaSHans Petter Selasky * RETURN VALUES
167*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the thread pool creation succeeded.
168*d6b92ffaSHans Petter Selasky *
169*d6b92ffaSHans Petter Selasky *	CL_INSUFFICIENT_MEMORY if there was not enough memory to inititalize
170*d6b92ffaSHans Petter Selasky *	the thread pool.
171*d6b92ffaSHans Petter Selasky *
172*d6b92ffaSHans Petter Selasky *	CL_ERROR if the threads could not be created.
173*d6b92ffaSHans Petter Selasky *
174*d6b92ffaSHans Petter Selasky * NOTES
175*d6b92ffaSHans Petter Selasky *	cl_thread_pool_init creates and starts the specified number of threads.
176*d6b92ffaSHans Petter Selasky *	If thread_count is zero, the thread pool creates as many threads as there
177*d6b92ffaSHans Petter Selasky *	are processors in the system.
178*d6b92ffaSHans Petter Selasky *
179*d6b92ffaSHans Petter Selasky * SEE ALSO
180*d6b92ffaSHans Petter Selasky *	Thread Pool, cl_thread_pool_destroy,
181*d6b92ffaSHans Petter Selasky *	cl_thread_pool_signal, cl_pfn_thread_callback_t
182*d6b92ffaSHans Petter Selasky *********/
183*d6b92ffaSHans Petter Selasky 
184*d6b92ffaSHans Petter Selasky /****f* Component Library: Thread Pool/cl_thread_pool_destroy
185*d6b92ffaSHans Petter Selasky * NAME
186*d6b92ffaSHans Petter Selasky *	cl_thread_pool_destroy
187*d6b92ffaSHans Petter Selasky *
188*d6b92ffaSHans Petter Selasky * DESCRIPTION
189*d6b92ffaSHans Petter Selasky *	The cl_thread_pool_destroy function performs any necessary cleanup
190*d6b92ffaSHans Petter Selasky *	for a thread pool.
191*d6b92ffaSHans Petter Selasky *
192*d6b92ffaSHans Petter Selasky * SYNOPSIS
193*d6b92ffaSHans Petter Selasky */
194*d6b92ffaSHans Petter Selasky void cl_thread_pool_destroy(IN cl_thread_pool_t * const p_thread_pool);
195*d6b92ffaSHans Petter Selasky /*
196*d6b92ffaSHans Petter Selasky * PARAMETERS
197*d6b92ffaSHans Petter Selasky *	p_thread_pool
198*d6b92ffaSHans Petter Selasky *		[in] Pointer to a thread pool structure to destroy.
199*d6b92ffaSHans Petter Selasky *
200*d6b92ffaSHans Petter Selasky * RETURN VALUE
201*d6b92ffaSHans Petter Selasky *	This function does not return a value.
202*d6b92ffaSHans Petter Selasky *
203*d6b92ffaSHans Petter Selasky * NOTES
204*d6b92ffaSHans Petter Selasky *	This function blocks until all threads exit, and must therefore not
205*d6b92ffaSHans Petter Selasky *	be called from any of the thread pool's threads. Because of its blocking
206*d6b92ffaSHans Petter Selasky *	nature, callers of cl_thread_pool_destroy must ensure that entering a wait
207*d6b92ffaSHans Petter Selasky *	state is valid from the calling thread context.
208*d6b92ffaSHans Petter Selasky *
209*d6b92ffaSHans Petter Selasky *	This function should only be called after a call to
210*d6b92ffaSHans Petter Selasky *	cl_thread_pool_init.
211*d6b92ffaSHans Petter Selasky *
212*d6b92ffaSHans Petter Selasky * SEE ALSO
213*d6b92ffaSHans Petter Selasky *	Thread Pool, cl_thread_pool_init
214*d6b92ffaSHans Petter Selasky *********/
215*d6b92ffaSHans Petter Selasky 
216*d6b92ffaSHans Petter Selasky /****f* Component Library: Thread Pool/cl_thread_pool_signal
217*d6b92ffaSHans Petter Selasky * NAME
218*d6b92ffaSHans Petter Selasky *	cl_thread_pool_signal
219*d6b92ffaSHans Petter Selasky *
220*d6b92ffaSHans Petter Selasky * DESCRIPTION
221*d6b92ffaSHans Petter Selasky *	The cl_thread_pool_signal function signals a single thread of
222*d6b92ffaSHans Petter Selasky *	the thread pool to invoke the thread pool's callback function.
223*d6b92ffaSHans Petter Selasky *
224*d6b92ffaSHans Petter Selasky * SYNOPSIS
225*d6b92ffaSHans Petter Selasky */
226*d6b92ffaSHans Petter Selasky cl_status_t cl_thread_pool_signal(IN cl_thread_pool_t * const p_thread_pool);
227*d6b92ffaSHans Petter Selasky /*
228*d6b92ffaSHans Petter Selasky * PARAMETERS
229*d6b92ffaSHans Petter Selasky *	p_thread_pool
230*d6b92ffaSHans Petter Selasky *		[in] Pointer to a thread pool structure to signal.
231*d6b92ffaSHans Petter Selasky *
232*d6b92ffaSHans Petter Selasky * RETURN VALUES
233*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the thread pool was successfully signalled.
234*d6b92ffaSHans Petter Selasky *
235*d6b92ffaSHans Petter Selasky *	CL_ERROR otherwise.
236*d6b92ffaSHans Petter Selasky *
237*d6b92ffaSHans Petter Selasky * NOTES
238*d6b92ffaSHans Petter Selasky *	Each call to this function wakes up at most one waiting thread in
239*d6b92ffaSHans Petter Selasky *	the thread pool.
240*d6b92ffaSHans Petter Selasky *
241*d6b92ffaSHans Petter Selasky *	If all threads are running, cl_thread_pool_signal has no effect.
242*d6b92ffaSHans Petter Selasky *
243*d6b92ffaSHans Petter Selasky * SEE ALSO
244*d6b92ffaSHans Petter Selasky *	Thread Pool
245*d6b92ffaSHans Petter Selasky *********/
246*d6b92ffaSHans Petter Selasky 
247*d6b92ffaSHans Petter Selasky END_C_DECLS
248*d6b92ffaSHans Petter Selasky #endif				/* _CL_THREAD_POOL_H_ */
249