1// Copyright (c) 2012 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#ifndef SANDBOX_SRC_WIN2K_THREADPOOL_H_ 6#define SANDBOX_SRC_WIN2K_THREADPOOL_H_ 7 8#include <list> 9#include <algorithm> 10#include "sandbox/win/src/crosscall_server.h" 11 12namespace sandbox { 13 14// Win2kThreadPool a simple implementation of a thread provider as required 15// for the sandbox IPC subsystem. See sandbox\crosscall_server.h for the details 16// and requirements of this interface. 17// 18// Implementing the thread provider as a thread pool is desirable in the case 19// of shared memory IPC because it can generate a large number of waitable 20// events: as many as channels. A thread pool does not create a thread per 21// event, instead maintains a few idle threads but can create more if the need 22// arises. 23// 24// This implementation simply thunks to the nice thread pool API of win2k. 25class Win2kThreadPool : public ThreadProvider { 26 public: 27 Win2kThreadPool() { 28 ::InitializeCriticalSection(&lock_); 29 } 30 virtual ~Win2kThreadPool(); 31 32 virtual bool RegisterWait(const void* cookie, HANDLE waitable_object, 33 CrossCallIPCCallback callback, 34 void* context); 35 36 virtual bool UnRegisterWaits(void* cookie); 37 38 // Returns the total number of wait objects associated with 39 // the thread pool. 40 size_t OutstandingWaits(); 41 42 private: 43 // record to keep track of a wait and its associated cookie. 44 struct PoolObject { 45 const void* cookie; 46 HANDLE wait; 47 }; 48 // The list of pool wait objects. 49 typedef std::list<PoolObject> PoolObjects; 50 PoolObjects pool_objects_; 51 // This lock protects the list of pool wait objects. 52 CRITICAL_SECTION lock_; 53 DISALLOW_COPY_AND_ASSIGN(Win2kThreadPool); 54}; 55 56} // namespace sandbox 57 58#endif // SANDBOX_SRC_WIN2K_THREADPOOL_H_ 59