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 12 namespace 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. 25 class 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