chromium/native_client_sdk/src/libraries/sdk_util/thread_pool.h

// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Simple thread pool class

#ifndef LIBRARIES_SDK_UTIL_THREAD_POOL_H_
#define LIBRARIES_SDK_UTIL_THREAD_POOL_H_

#include <pthread.h>
#include <semaphore.h>

#include "sdk_util/atomicops.h"

namespace sdk_util {

// typdef helper for work function
typedef void (*WorkFunction)(int task_index, void* data);

// ThreadPool is a class to manage num_threads and assign
// them num_tasks of work at a time. Each call
// to Dispatch(..) will block until all tasks complete.
// If 0 is passed in for num_threads, all tasks will be
// issued on the dispatch thread.

class ThreadPool {
 public:
  void Dispatch(int num_tasks, WorkFunction work, void* data);
  explicit ThreadPool(int num_threads);
  ~ThreadPool();
 private:
  int DecCounter();
  void Setup(int counter, WorkFunction work, void* data);
  void DispatchMany(int num_tasks, WorkFunction work, void* data);
  void DispatchHere(int num_tasks, WorkFunction work, void* data);
  void WorkLoop();
  static void* WorkerThreadEntry(void* data);
  void PostExitAndJoinAll();
  pthread_t* threads_;
  Atomic32 counter_;
  const int num_threads_;
  bool exiting_;
  void* user_data_;
  WorkFunction user_work_function_;
  sem_t work_sem_;
  sem_t done_sem_;
};

}  // namespace sdk_util

#endif  // LIBRARIES_SDK_UTIL_THREAD_POOL_H_