/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** \file ThreadPool.h ThreadPool interface */ /** \brief Closure represents a deferred computation */ typedef struct { void (*mHandler)(void *, int); void *mContext; int mParameter; } Closure; /** \brief ThreadPool manages a pool of worker threads that execute Closures */ typedef struct { unsigned mInitialized; ///< Indicates which of the following 3 fields are initialized pthread_mutex_t mMutex; pthread_cond_t mCondNotFull; ///< Signalled when a client thread could be unblocked pthread_cond_t mCondNotEmpty; ///< Signalled when a worker thread could be unblocked SLboolean mShutdown; ///< Whether shutdown of thread pool has been requested unsigned mWaitingNotFull; ///< Number of client threads waiting to enqueue unsigned mWaitingNotEmpty; ///< Number of worker threads waiting to dequeue unsigned mMaxClosures; ///< Number of slots in circular buffer for closures, not counting spare unsigned mMaxThreads; ///< Number of worker threads Closure **mClosureArray; ///< The circular buffer of closures Closure **mClosureFront, **mClosureRear; /// Saves a malloc in the typical case #define CLOSURE_TYPICAL 15 Closure *mClosureTypical[CLOSURE_TYPICAL+1]; pthread_t *mThreadArray; ///< The worker threads #ifdef ANDROID #define THREAD_TYPICAL 0 #else #define THREAD_TYPICAL 4 #endif pthread_t mThreadTypical[THREAD_TYPICAL]; } ThreadPool; extern SLresult ThreadPool_init(ThreadPool *tp, unsigned maxClosures, unsigned maxThreads); extern void ThreadPool_deinit(ThreadPool *tp); extern SLresult ThreadPool_add(ThreadPool *tp, void (*handler)(void *, int), void *context, int parameter); extern Closure *ThreadPool_remove(ThreadPool *tp);