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.
5 #include "sandbox/win/src/win2k_threadpool.h"
7 #include "sandbox/win/src/win_utils.h"
11 bool Win2kThreadPool::RegisterWait(const void* cookie
, HANDLE waitable_object
,
12 CrossCallIPCCallback callback
,
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
)) {
23 PoolObject pool_obj
= {cookie
, pool_object
};
24 AutoLock
lock(&lock_
);
25 pool_objects_
.push_back(pool_obj
);
29 bool Win2kThreadPool::UnRegisterWaits(void* cookie
) {
33 AutoLock
lock(&lock_
);
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);
48 size_t Win2kThreadPool::OutstandingWaits() {
49 AutoLock
lock(&lock_
);
50 return pool_objects_
.size();
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_
);
60 } // namespace sandbox