writable_shared_memory_region.cc 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Copyright 2018 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 "base/memory/writable_shared_memory_region.h"
  5. #include <utility>
  6. #include "build/build_config.h"
  7. namespace base {
  8. WritableSharedMemoryRegion::CreateFunction*
  9. WritableSharedMemoryRegion::create_hook_ = nullptr;
  10. // static
  11. WritableSharedMemoryRegion WritableSharedMemoryRegion::Create(size_t size) {
  12. if (create_hook_)
  13. return create_hook_(size);
  14. subtle::PlatformSharedMemoryRegion handle =
  15. subtle::PlatformSharedMemoryRegion::CreateWritable(size);
  16. return WritableSharedMemoryRegion(std::move(handle));
  17. }
  18. // static
  19. WritableSharedMemoryRegion WritableSharedMemoryRegion::Deserialize(
  20. subtle::PlatformSharedMemoryRegion handle) {
  21. return WritableSharedMemoryRegion(std::move(handle));
  22. }
  23. // static
  24. subtle::PlatformSharedMemoryRegion
  25. WritableSharedMemoryRegion::TakeHandleForSerialization(
  26. WritableSharedMemoryRegion region) {
  27. return std::move(region.handle_);
  28. }
  29. // static
  30. ReadOnlySharedMemoryRegion WritableSharedMemoryRegion::ConvertToReadOnly(
  31. WritableSharedMemoryRegion region) {
  32. subtle::PlatformSharedMemoryRegion handle = std::move(region.handle_);
  33. if (!handle.ConvertToReadOnly())
  34. return {};
  35. return ReadOnlySharedMemoryRegion::Deserialize(std::move(handle));
  36. }
  37. UnsafeSharedMemoryRegion WritableSharedMemoryRegion::ConvertToUnsafe(
  38. WritableSharedMemoryRegion region) {
  39. subtle::PlatformSharedMemoryRegion handle = std::move(region.handle_);
  40. if (!handle.ConvertToUnsafe())
  41. return {};
  42. return UnsafeSharedMemoryRegion::Deserialize(std::move(handle));
  43. }
  44. WritableSharedMemoryRegion::WritableSharedMemoryRegion() = default;
  45. WritableSharedMemoryRegion::WritableSharedMemoryRegion(
  46. WritableSharedMemoryRegion&& region) = default;
  47. WritableSharedMemoryRegion& WritableSharedMemoryRegion::operator=(
  48. WritableSharedMemoryRegion&& region) = default;
  49. WritableSharedMemoryRegion::~WritableSharedMemoryRegion() = default;
  50. WritableSharedMemoryMapping WritableSharedMemoryRegion::Map(
  51. SharedMemoryMapper* mapper) const {
  52. return MapAt(0, handle_.GetSize(), mapper);
  53. }
  54. WritableSharedMemoryMapping WritableSharedMemoryRegion::MapAt(
  55. uint64_t offset,
  56. size_t size,
  57. SharedMemoryMapper* mapper) const {
  58. if (!IsValid())
  59. return {};
  60. auto result = handle_.MapAt(offset, size, mapper);
  61. if (!result.has_value())
  62. return {};
  63. return WritableSharedMemoryMapping(result.value(), size, handle_.GetGUID(),
  64. mapper);
  65. }
  66. bool WritableSharedMemoryRegion::IsValid() const {
  67. return handle_.IsValid();
  68. }
  69. WritableSharedMemoryRegion::WritableSharedMemoryRegion(
  70. subtle::PlatformSharedMemoryRegion handle)
  71. : handle_(std::move(handle)) {
  72. if (handle_.IsValid()) {
  73. CHECK_EQ(handle_.GetMode(),
  74. subtle::PlatformSharedMemoryRegion::Mode::kWritable);
  75. }
  76. }
  77. } // namespace base