Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(506)

Unified Diff: mojo/edk/embedder/platform_shared_buffer.cc

Issue 1689053003: Support read-only duplicates of Mojo shared buffers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@mojo-shm-interop
Patch Set: Rebase and fix comment. Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/edk/embedder/platform_shared_buffer.h ('k') | mojo/edk/system/broker_posix.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/edk/embedder/platform_shared_buffer.cc
diff --git a/mojo/edk/embedder/platform_shared_buffer.cc b/mojo/edk/embedder/platform_shared_buffer.cc
index 614b19c0c0d4884d651e1bd1117fcf5062813636..a29a7abd76152ee45f35f6f91d02a1ce2f33c159 100644
--- a/mojo/edk/embedder/platform_shared_buffer.cc
+++ b/mojo/edk/embedder/platform_shared_buffer.cc
@@ -44,7 +44,7 @@ ScopedPlatformHandle SharedMemoryToPlatformHandle(
PlatformSharedBuffer* PlatformSharedBuffer::Create(size_t num_bytes) {
DCHECK_GT(num_bytes, 0u);
- PlatformSharedBuffer* rv = new PlatformSharedBuffer(num_bytes);
+ PlatformSharedBuffer* rv = new PlatformSharedBuffer(num_bytes, false);
if (!rv->Init()) {
// We can't just delete it directly, due to the "in destructor" (debug)
// check.
@@ -58,10 +58,11 @@ PlatformSharedBuffer* PlatformSharedBuffer::Create(size_t num_bytes) {
// static
PlatformSharedBuffer* PlatformSharedBuffer::CreateFromPlatformHandle(
size_t num_bytes,
+ bool read_only,
ScopedPlatformHandle platform_handle) {
DCHECK_GT(num_bytes, 0u);
- PlatformSharedBuffer* rv = new PlatformSharedBuffer(num_bytes);
+ PlatformSharedBuffer* rv = new PlatformSharedBuffer(num_bytes, read_only);
if (!rv->InitFromPlatformHandle(std::move(platform_handle))) {
// We can't just delete it directly, due to the "in destructor" (debug)
// check.
@@ -78,9 +79,8 @@ PlatformSharedBuffer* PlatformSharedBuffer::CreateFromSharedMemoryHandle(
bool read_only,
base::SharedMemoryHandle handle) {
DCHECK_GT(num_bytes, 0u);
- DCHECK(!read_only);
- PlatformSharedBuffer* rv = new PlatformSharedBuffer(num_bytes);
+ PlatformSharedBuffer* rv = new PlatformSharedBuffer(num_bytes, read_only);
rv->InitFromSharedMemoryHandle(handle);
return rv;
@@ -90,6 +90,10 @@ size_t PlatformSharedBuffer::GetNumBytes() const {
return num_bytes_;
}
+bool PlatformSharedBuffer::IsReadOnly() const {
+ return read_only_;
+}
+
scoped_ptr<PlatformSharedBufferMapping> PlatformSharedBuffer::Map(
size_t offset,
size_t length) {
@@ -125,7 +129,7 @@ scoped_ptr<PlatformSharedBufferMapping> PlatformSharedBuffer::MapNoCheck(
return nullptr;
scoped_ptr<PlatformSharedBufferMapping> mapping(
- new PlatformSharedBufferMapping(handle, offset, length));
+ new PlatformSharedBufferMapping(handle, read_only_, offset, length));
if (mapping->Map())
return make_scoped_ptr(mapping.release());
@@ -164,16 +168,34 @@ base::SharedMemoryHandle PlatformSharedBuffer::DuplicateSharedMemoryHandle() {
return base::SharedMemory::DuplicateHandle(shared_memory_->handle());
}
-PlatformSharedBuffer::PlatformSharedBuffer(size_t num_bytes)
- : num_bytes_(num_bytes) {}
+PlatformSharedBuffer* PlatformSharedBuffer::CreateReadOnlyDuplicate() {
+ DCHECK(shared_memory_);
+ base::SharedMemoryHandle handle;
+ bool success;
+ {
+ base::AutoLock locker(lock_);
+ success = shared_memory_->ShareReadOnlyToProcess(
+ base::GetCurrentProcessHandle(), &handle);
+ }
+ if (!success || handle == base::SharedMemory::NULLHandle())
+ return nullptr;
+
+ return CreateFromSharedMemoryHandle(num_bytes_, true, handle);
+}
+
+PlatformSharedBuffer::PlatformSharedBuffer(size_t num_bytes, bool read_only)
+ : num_bytes_(num_bytes), read_only_(read_only) {}
PlatformSharedBuffer::~PlatformSharedBuffer() {}
bool PlatformSharedBuffer::Init() {
DCHECK(!shared_memory_);
+ DCHECK(!read_only_);
base::SharedMemoryCreateOptions options;
options.size = num_bytes_;
+ // By default, we can share as read-only.
+ options.share_read_only = true;
#if defined(OS_MACOSX) && !defined(OS_IOS)
options.type = base::SharedMemoryHandle::MACH;
#endif
@@ -201,7 +223,7 @@ bool PlatformSharedBuffer::InitFromPlatformHandle(
base::SharedMemoryHandle handle(platform_handle.release().handle, false);
#endif
- shared_memory_.reset(new base::SharedMemory(handle, false));
+ shared_memory_.reset(new base::SharedMemory(handle, read_only_));
return true;
}
@@ -209,8 +231,7 @@ void PlatformSharedBuffer::InitFromSharedMemoryHandle(
base::SharedMemoryHandle handle) {
DCHECK(!shared_memory_);
- // TODO(crbug.com/556587): Support read-only handles.
- shared_memory_.reset(new base::SharedMemory(handle, false));
+ shared_memory_.reset(new base::SharedMemory(handle, read_only_));
}
PlatformSharedBufferMapping::~PlatformSharedBufferMapping() {
« no previous file with comments | « mojo/edk/embedder/platform_shared_buffer.h ('k') | mojo/edk/system/broker_posix.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698