Home | History | Annotate | Download | only in sdk_util
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Simple thread pool class
      6 
      7 #ifndef LIBRARIES_SDK_UTIL_THREAD_POOL_H_
      8 #define LIBRARIES_SDK_UTIL_THREAD_POOL_H_
      9 
     10 #include <pthread.h>
     11 #include <semaphore.h>
     12 
     13 #include "sdk_util/atomicops.h"
     14 
     15 namespace sdk_util {
     16 
     17 // typdef helper for work function
     18 typedef void (*WorkFunction)(int task_index, void* data);
     19 
     20 // ThreadPool is a class to manage num_threads and assign
     21 // them num_tasks of work at a time. Each call
     22 // to Dispatch(..) will block until all tasks complete.
     23 // If 0 is passed in for num_threads, all tasks will be
     24 // issued on the dispatch thread.
     25 
     26 class ThreadPool {
     27  public:
     28   void Dispatch(int num_tasks, WorkFunction work, void* data);
     29   explicit ThreadPool(int num_threads);
     30   ~ThreadPool();
     31  private:
     32   int DecCounter();
     33   void Setup(int counter, WorkFunction work, void* data);
     34   void DispatchMany(int num_tasks, WorkFunction work, void* data);
     35   void DispatchHere(int num_tasks, WorkFunction work, void* data);
     36   void WorkLoop();
     37   static void* WorkerThreadEntry(void* data);
     38   void PostExitAndJoinAll();
     39   pthread_t* threads_;
     40   Atomic32 counter_;
     41   const int num_threads_;
     42   bool exiting_;
     43   void* user_data_;
     44   WorkFunction user_work_function_;
     45   sem_t work_sem_;
     46   sem_t done_sem_;
     47 };
     48 
     49 }  // namespace sdk_util
     50 
     51 #endif  // LIBRARIES_SDK_UTIL_THREAD_POOL_H_
     52 
     53