ThreadPool.h revision cf3a6383a9bc9a94ca5b424ea97313293ee0dcb0
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17/** \file ThreadPool.h ThreadPool interface */ 18 19/** Kind of closure */ 20 21typedef enum { 22 CLOSURE_KIND_PPI, // void *, void *, int 23 CLOSURE_KIND_PPII // void *, void *, int, int 24} ClosureKind; 25 26/** Closure handlers */ 27 28typedef void (*ClosureHandler_ppi)(void *context1, void *context2, int parameter1); 29typedef void (*ClosureHandler_ppii)(void *context1, void *context2, int parameter1, int parameter2); 30 31/** \brief Closure represents a deferred computation */ 32 33typedef struct { 34 union { 35 ClosureHandler_ppi mHandler_ppi; 36 ClosureHandler_ppii mHandler_ppii; 37 } mHandler; 38 ClosureKind mKind; 39 void *mContext1; 40 void *mContext2; 41 int mParameter1; 42 int mParameter2; 43} Closure; 44 45/** \brief ThreadPool manages a pool of worker threads that execute Closures */ 46 47typedef struct { 48 unsigned mInitialized; ///< Indicates which of the following 3 fields are initialized 49 pthread_mutex_t mMutex; 50 pthread_cond_t mCondNotFull; ///< Signalled when a client thread could be unblocked 51 pthread_cond_t mCondNotEmpty; ///< Signalled when a worker thread could be unblocked 52 SLboolean mShutdown; ///< Whether shutdown of thread pool has been requested 53 unsigned mWaitingNotFull; ///< Number of client threads waiting to enqueue 54 unsigned mWaitingNotEmpty; ///< Number of worker threads waiting to dequeue 55 unsigned mMaxClosures; ///< Number of slots in circular buffer for closures, not counting spare 56 unsigned mMaxThreads; ///< Number of worker threads 57 Closure **mClosureArray; ///< The circular buffer of closures 58 Closure **mClosureFront, **mClosureRear; 59 /// Saves a malloc in the typical case 60#define CLOSURE_TYPICAL 15 61 Closure *mClosureTypical[CLOSURE_TYPICAL+1]; 62 pthread_t *mThreadArray; ///< The worker threads 63#ifdef ANDROID 64#define THREAD_TYPICAL 2 65#else 66#define THREAD_TYPICAL 4 67#endif 68 pthread_t mThreadTypical[THREAD_TYPICAL]; 69} ThreadPool; 70 71extern SLresult ThreadPool_init(ThreadPool *tp, unsigned maxClosures, unsigned maxThreads); 72extern void ThreadPool_deinit(ThreadPool *tp); 73extern SLresult ThreadPool_add(ThreadPool *tp, ClosureKind kind, 74 void (*handler)(void *, void *, int, int), void *context1, 75 void *context2, int parameter1, int parameter2); 76extern Closure *ThreadPool_remove(ThreadPool *tp); 77extern SLresult ThreadPool_add_ppi(ThreadPool *tp, ClosureHandler_ppi handler, 78 void *context1, void *context2, int parameter1); 79extern SLresult ThreadPool_add_ppii(ThreadPool *tp, ClosureHandler_ppii handler, 80 void *context1, void *context2, int parameter1, int parameter2); 81