threadpool.cc 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. #include "sandbox/win/src/threadpool.h"
  5. #include <windows.h>
  6. #include <stddef.h>
  7. #include <vector>
  8. namespace sandbox {
  9. ThreadPool::ThreadPool() = default;
  10. ThreadPool::~ThreadPool() = default;
  11. bool ThreadPool::RegisterWait(const void* cookie,
  12. HANDLE waitable_object,
  13. CrossCallIPCCallback callback,
  14. void* context) {
  15. if (0 == cookie) {
  16. return false;
  17. }
  18. HANDLE pool_object = nullptr;
  19. // create a wait for a kernel object, with no timeout
  20. if (!::RegisterWaitForSingleObject(&pool_object, waitable_object, callback,
  21. context, INFINITE, WT_EXECUTEDEFAULT)) {
  22. return false;
  23. }
  24. PoolObject pool_obj = {cookie, pool_object};
  25. base::AutoLock lock(lock_);
  26. pool_objects_.push_back(pool_obj);
  27. return true;
  28. }
  29. bool ThreadPool::UnRegisterWaits(void* cookie) {
  30. if (0 == cookie) {
  31. return false;
  32. }
  33. std::vector<HANDLE> finished_waits;
  34. {
  35. base::AutoLock lock(lock_);
  36. PoolObjects::iterator it = pool_objects_.begin();
  37. while (it != pool_objects_.end()) {
  38. if (it->cookie == cookie) {
  39. HANDLE wait = it->wait;
  40. it = pool_objects_.erase(it);
  41. finished_waits.push_back(wait);
  42. } else {
  43. ++it;
  44. }
  45. }
  46. }
  47. bool success = true;
  48. for (HANDLE wait : finished_waits) {
  49. success &= (::UnregisterWaitEx(wait, INVALID_HANDLE_VALUE) != 0);
  50. }
  51. return success;
  52. }
  53. size_t ThreadPool::OutstandingWaits() {
  54. base::AutoLock lock(lock_);
  55. return pool_objects_.size();
  56. }
  57. } // namespace sandbox