Home | History | Annotate | Download | only in src
      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 #include "sandbox/win/src/win2k_threadpool.h"
      6 
      7 #include "sandbox/win/src/win_utils.h"
      8 
      9 namespace sandbox {
     10 
     11 bool Win2kThreadPool::RegisterWait(const void* cookie, HANDLE waitable_object,
     12                                    CrossCallIPCCallback callback,
     13                                    void* context) {
     14   if (0 == cookie) {
     15     return false;
     16   }
     17   HANDLE pool_object = NULL;
     18   // create a wait for a kernel object, with no timeout
     19   if (!::RegisterWaitForSingleObject(&pool_object, waitable_object, callback,
     20                                      context, INFINITE, WT_EXECUTEDEFAULT)) {
     21     return false;
     22   }
     23   PoolObject pool_obj = {cookie, pool_object};
     24   AutoLock lock(&lock_);
     25   pool_objects_.push_back(pool_obj);
     26   return true;
     27 }
     28 
     29 bool Win2kThreadPool::UnRegisterWaits(void* cookie) {
     30   if (0 == cookie) {
     31     return false;
     32   }
     33   AutoLock lock(&lock_);
     34   bool success = true;
     35   PoolObjects::iterator it = pool_objects_.begin();
     36   while (it != pool_objects_.end()) {
     37     if (it->cookie == cookie) {
     38       HANDLE wait = it->wait;
     39       it = pool_objects_.erase(it);
     40       success &= (::UnregisterWaitEx(wait, INVALID_HANDLE_VALUE) != 0);
     41     } else {
     42       ++it;
     43     }
     44   }
     45   return success;
     46 }
     47 
     48 size_t Win2kThreadPool::OutstandingWaits() {
     49   AutoLock lock(&lock_);
     50   return pool_objects_.size();
     51 }
     52 
     53 Win2kThreadPool::~Win2kThreadPool() {
     54   // Here we used to unregister all the pool wait handles. Now, following the
     55   // rest of the code we avoid lengthy or blocking calls given that the process
     56   // is being torn down.
     57   ::DeleteCriticalSection(&lock_);
     58 }
     59 
     60 }  // namespace sandbox
     61