• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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