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