unsafe_shared_memory_region.cc 2.4 KB

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