OLD | NEW |
| (Empty) |
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/src/win2k_threadpool.h" | |
6 | |
7 #include "sandbox/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 | |
OLD | NEW |