Chromium Code Reviews| Index: base/memory/shared_memory_handle.h |
| diff --git a/base/memory/shared_memory_handle.h b/base/memory/shared_memory_handle.h |
| index c3fd7ae34bfe40ff424edddec762174df3f3532e..aaf16968d54141a7a70834a54e3aa5f829cea3be 100644 |
| --- a/base/memory/shared_memory_handle.h |
| +++ b/base/memory/shared_memory_handle.h |
| @@ -14,7 +14,9 @@ |
| #include "base/process/process_handle.h" |
| #elif defined(OS_MACOSX) && !defined(OS_IOS) |
| #include <mach/mach.h> |
| +#include <sys/types.h> |
| #include "base/base_export.h" |
| +#include "base/file_descriptor_posix.h" |
| #include "base/macros.h" |
| #include "base/process/process_handle.h" |
| #elif defined(OS_POSIX) |
| @@ -83,9 +85,32 @@ class BASE_EXPORT SharedMemoryHandle { |
| #else |
| class BASE_EXPORT SharedMemoryHandle { |
| public: |
| + // The values of these enums must not change, as they are used by the |
| + // histogram OSX.SharedMemory.Mechanism. |
| + enum Type { |
| + // The SharedMemoryHandle is backed by a POSIX fd. |
| + POSIX, |
| + // The SharedMemoryHandle is backed by the Mach primitive "memory object". |
| + MACH, |
| + }; |
| + static const int TypeMax = 2; |
|
erikchen
2016/12/06 19:00:41
Is TypeMax needed? Since you don't need IPC, I thi
lawrencewu
2016/12/06 21:04:40
Removed.
|
| + |
| + // The format that should be used to transmit |Type| over the wire. |
| + typedef int TypeWireFormat; |
| + |
| // The default constructor returns an invalid SharedMemoryHandle. |
| SharedMemoryHandle(); |
| + // Constructs a SharedMemoryHandle backed by the components of a |
| + // FileDescriptor. The newly created instance has the same ownership semantics |
| + // as base::FileDescriptor. This typically means that the SharedMemoryHandle |
| + // takes ownership of the |fd| if |auto_close| is true. Unfortunately, it's |
| + // common for existing code to make shallow copies of SharedMemoryHandle, and |
| + // the one that is finally passed into a base::SharedMemory is the one that |
| + // "consumes" the fd. |
| + explicit SharedMemoryHandle(const base::FileDescriptor& file_descriptor); |
| + SharedMemoryHandle(int fd, bool auto_close); |
|
erikchen
2016/12/06 19:00:41
I think you probably don't need line #112, right?
lawrencewu
2016/12/06 21:04:40
Nope, removed and made existing calls use the firs
|
| + |
| // Makes a Mach-based SharedMemoryHandle of the given size. On error, |
| // subsequent calls to IsValid() return false. |
| explicit SharedMemoryHandle(mach_vm_size_t size); |
| @@ -111,16 +136,28 @@ class BASE_EXPORT SharedMemoryHandle { |
| bool operator==(const SharedMemoryHandle& handle) const; |
| bool operator!=(const SharedMemoryHandle& handle) const; |
| + // Returns the type. |
| + Type GetType() const; |
|
erikchen
2016/12/06 19:00:41
Given that there's only 1 producer/consumer of POS
lawrencewu
2016/12/06 21:04:40
Nope, made private.
|
| + |
| // Whether the underlying OS primitive is valid. Once the SharedMemoryHandle |
| // is backed by a valid OS primitive, it becomes immutable. |
| bool IsValid() const; |
| + // Sets the POSIX fd backing the SharedMemoryHandle. Requires that the |
| + // SharedMemoryHandle be backed by a POSIX fd. |
| + void SetFileHandle(int fd, bool auto_close); |
| + |
| + // This method assumes that the SharedMemoryHandle is backed by a POSIX fd. |
| + // This is eventually no longer going to be true, so please avoid adding new |
| + // uses of this method. |
| + const FileDescriptor GetFileDescriptor() const; |
| + |
| // Exposed so that the SharedMemoryHandle can be transported between |
| // processes. |
| mach_port_t GetMemoryObject() const; |
| // Returns false on a failure to determine the size. On success, populates the |
| - // output variable |size|. Returns 0 if the handle is invalid. |
| + // output variable |size|. |
| bool GetSize(size_t* size) const; |
| // The SharedMemoryHandle must be valid. |
| @@ -139,21 +176,31 @@ class BASE_EXPORT SharedMemoryHandle { |
| // Shared code between copy constructor and operator=. |
| void CopyRelevantData(const SharedMemoryHandle& handle); |
| - mach_port_t memory_object_ = MACH_PORT_NULL; |
| + Type type_; |
| - // The size of the shared memory region when |type_| is MACH. Only |
| - // relevant if |memory_object_| is not |MACH_PORT_NULL|. |
| - mach_vm_size_t size_ = 0; |
| + // Each instance of a SharedMemoryHandle is backed either by a POSIX fd or a |
| + // mach port. |type_| determines the backing member. |
| + union { |
| + FileDescriptor file_descriptor_; |
| - // The pid of the process in which |memory_object_| is usable. Only |
| - // relevant if |memory_object_| is not |MACH_PORT_NULL|. |
| - base::ProcessId pid_ = 0; |
| + struct { |
| + mach_port_t memory_object_; |
| - // Whether passing this object as a parameter to an IPC message passes |
| - // ownership of |memory_object_| to the IPC stack. This is meant to mimic |
| - // the behavior of the |auto_close| parameter of FileDescriptor. |
| - // Defaults to |false|. |
| - bool ownership_passes_to_ipc_ = false; |
| + // The size of the shared memory region when |type_| is MACH. Only |
| + // relevant if |memory_object_| is not |MACH_PORT_NULL|. |
| + mach_vm_size_t size_; |
| + |
| + // The pid of the process in which |memory_object_| is usable. Only |
| + // relevant if |memory_object_| is not |MACH_PORT_NULL|. |
| + base::ProcessId pid_; |
| + |
| + // Whether passing this object as a parameter to an IPC message passes |
| + // ownership of |memory_object_| to the IPC stack. This is meant to mimic |
| + // the behavior of the |auto_close| parameter of FileDescriptor. |
| + // Defaults to |false|. |
| + bool ownership_passes_to_ipc_; |
| + }; |
| + }; |
| }; |
| #endif |