15c6d2ecb9c43d8b836b3203a243e24703d473765Stephen Canon// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25c6d2ecb9c43d8b836b3203a243e24703d473765Stephen Canon// Use of this source code is governed by a BSD-style license that can be 35c6d2ecb9c43d8b836b3203a243e24703d473765Stephen Canon// found in the LICENSE file. 45c6d2ecb9c43d8b836b3203a243e24703d473765Stephen Canon 59ad441ffec97db647fee3725b3424284fb913e14Howard Hinnant#include "sandbox/win/src/win2k_threadpool.h" 69ad441ffec97db647fee3725b3424284fb913e14Howard Hinnant 75c6d2ecb9c43d8b836b3203a243e24703d473765Stephen Canon#include "sandbox/win/src/win_utils.h" 85c6d2ecb9c43d8b836b3203a243e24703d473765Stephen Canon 95c6d2ecb9c43d8b836b3203a243e24703d473765Stephen Canonnamespace sandbox { 105c6d2ecb9c43d8b836b3203a243e24703d473765Stephen Canon 115c6d2ecb9c43d8b836b3203a243e24703d473765Stephen Canonbool Win2kThreadPool::RegisterWait(const void* cookie, HANDLE waitable_object, 125c6d2ecb9c43d8b836b3203a243e24703d473765Stephen Canon CrossCallIPCCallback callback, 135c6d2ecb9c43d8b836b3203a243e24703d473765Stephen Canon void* context) { 14e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon if (0 == cookie) { 15e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon return false; 16e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon } 17e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon HANDLE pool_object = NULL; 180193b74976719b8aea4cb8874ba36b75836a8d6eChandler Carruth // create a wait for a kernel object, with no timeout 1937b97d1cf4501b94347e0b4e880f4b25825a289fAnton Korobeynikov if (!::RegisterWaitForSingleObject(&pool_object, waitable_object, callback, 201c5f89b1dd741135a4007ab577723d422f421eecAnton Korobeynikov context, INFINITE, WT_EXECUTEDEFAULT)) { 211c5f89b1dd741135a4007ab577723d422f421eecAnton Korobeynikov return false; 22e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon } 23e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon PoolObject pool_obj = {cookie, pool_object}; 24e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon AutoLock lock(&lock_); 25e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon pool_objects_.push_back(pool_obj); 26e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon return true; 27e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon} 28e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon 29e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canonbool Win2kThreadPool::UnRegisterWaits(void* cookie) { 30e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon if (0 == cookie) { 31e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon return false; 32e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon } 33e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon AutoLock lock(&lock_); 34e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon bool success = true; 35e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon PoolObjects::iterator it = pool_objects_.begin(); 36e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon while (it != pool_objects_.end()) { 37e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon if (it->cookie == cookie) { 38e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon HANDLE wait = it->wait; 39e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon it = pool_objects_.erase(it); 40e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon success &= (::UnregisterWaitEx(wait, INVALID_HANDLE_VALUE) != 0); 41e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon } else { 42e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon ++it; 43e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon } 44e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon } 45e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon return success; 46e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon} 47e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon 48e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canonsize_t Win2kThreadPool::OutstandingWaits() { 49e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon AutoLock lock(&lock_); 50e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon return pool_objects_.size(); 51e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon} 52e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon 53e5086322295e5a345af02d09abfcf8ddca2d0897Stephen CanonWin2kThreadPool::~Win2kThreadPool() { 54e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon // Here we used to unregister all the pool wait handles. Now, following the 55e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon // rest of the code we avoid lengthy or blocking calls given that the process 56e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon // is being torn down. 57e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon ::DeleteCriticalSection(&lock_); 58e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon} 59e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon 60e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon} // namespace sandbox 61e5086322295e5a345af02d09abfcf8ddca2d0897Stephen Canon