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 |