ipcz_api.cc 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // Copyright 2022 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 "mojo/core/ipcz_api.h"
  5. #include "base/check_op.h"
  6. #include "mojo/core/ipcz_driver/driver.h"
  7. #include "third_party/ipcz/include/ipcz/ipcz.h"
  8. #include "third_party/ipcz/src/api.h"
  9. namespace mojo::core {
  10. namespace {
  11. class IpczAPIInitializer {
  12. public:
  13. explicit IpczAPIInitializer(IpczAPI& api) {
  14. IpczResult result = IpczGetAPI(&api);
  15. CHECK_EQ(result, IPCZ_RESULT_OK);
  16. }
  17. };
  18. IpczHandle g_node = IPCZ_INVALID_HANDLE;
  19. IpczNodeOptions g_options = {.is_broker = false,
  20. .use_local_shared_memory_allocation = false};
  21. } // namespace
  22. const IpczAPI& GetIpczAPI() {
  23. static IpczAPI api = {sizeof(api)};
  24. static IpczAPIInitializer initializer(api);
  25. return api;
  26. }
  27. IpczHandle GetIpczNode() {
  28. return g_node;
  29. }
  30. bool InitializeIpczNodeForProcess(const IpczNodeOptions& options) {
  31. g_options = options;
  32. IpczCreateNodeFlags flags =
  33. options.is_broker ? IPCZ_CREATE_NODE_AS_BROKER : IPCZ_NO_FLAGS;
  34. IpczResult result =
  35. GetIpczAPI().CreateNode(&ipcz_driver::kDriver, IPCZ_INVALID_DRIVER_HANDLE,
  36. flags, nullptr, &g_node);
  37. return result == IPCZ_RESULT_OK;
  38. }
  39. void DestroyIpczNodeForProcess() {
  40. CHECK(g_node);
  41. GetIpczAPI().Close(g_node, IPCZ_NO_FLAGS, nullptr);
  42. g_node = IPCZ_INVALID_HANDLE;
  43. }
  44. const IpczNodeOptions& GetIpczNodeOptions() {
  45. return g_options;
  46. }
  47. } // namespace mojo::core