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
9namespace sandbox {
10
11bool 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
29bool 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
48size_t Win2kThreadPool::OutstandingWaits() {
49  AutoLock lock(&lock_);
50  return pool_objects_.size();
51}
52
53Win2kThreadPool::~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