Index: ipc/ipc_message_utils.cc |
diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc |
index 8053318110d78f2eda9b81f9721a9070c59f6c29..db36c0fe7a62622fd0b7e4489c2bfdfd26f4a2f7 100644 |
--- a/ipc/ipc_message_utils.cc |
+++ b/ipc/ipc_message_utils.cc |
@@ -10,6 +10,7 @@ |
#include "base/files/file_path.h" |
#include "base/json/json_writer.h" |
#include "base/memory/ptr_util.h" |
+#include "base/memory/shared_memory_handle.h" |
#include "base/strings/nullable_string16.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/utf_string_conversions.h" |
@@ -27,10 +28,6 @@ |
#include "ipc/ipc_platform_file_attachment_posix.h" |
#endif |
-#if (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN) |
-#include "base/memory/shared_memory_handle.h" |
-#endif // (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN) |
- |
#if defined(OS_MACOSX) && !defined(OS_IOS) |
#include "ipc/mach_port_mac.h" |
#endif |
@@ -647,7 +644,6 @@ bool ParamTraits<base::FileDescriptor>::Read(const base::Pickle* m, |
if (!ReadParam(m, iter, &valid)) |
return false; |
- // TODO(morrita): Seems like this should return false. |
if (!valid) |
return true; |
@@ -781,6 +777,69 @@ void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p, |
l->append(" needs brokering: "); |
LogParam(p.NeedsBrokering(), l); |
} |
+#elif defined(OS_POSIX) |
+void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* sizer, |
+ const param_type& p) { |
+ GetParamSize(sizer, p.IsValid()); |
+ if (p.IsValid()) |
+ sizer->AddAttachment(); |
+} |
+ |
+void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m, |
+ const param_type& p) { |
+ const bool valid = p.IsValid(); |
+ WriteParam(m, valid); |
+ |
+ if (!valid) |
+ return; |
+ |
+ if (p.OwnershipPassesToIPC()) { |
+ if (!m->WriteAttachment(new internal::PlatformFileAttachment( |
+ base::ScopedFD(p.GetHandle())))) |
+ NOTREACHED(); |
+ } else { |
+ if (!m->WriteAttachment( |
+ new internal::PlatformFileAttachment(p.GetHandle()))) |
+ NOTREACHED(); |
+ } |
+} |
+ |
+bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m, |
+ base::PickleIterator* iter, |
+ param_type* r) { |
+ *r = base::SharedMemoryHandle(); |
+ |
+ bool valid; |
+ if (!ReadParam(m, iter, &valid)) |
+ return false; |
+ |
+ if (!valid) |
+ return true; |
+ |
+ scoped_refptr<base::Pickle::Attachment> attachment; |
+ if (!m->ReadAttachment(iter, &attachment)) |
+ return false; |
+ |
+ if (static_cast<MessageAttachment*>(attachment.get())->GetType() != |
+ MessageAttachment::Type::PLATFORM_FILE) { |
+ return false; |
+ } |
+ |
+ *r = base::SharedMemoryHandle(base::FileDescriptor( |
+ static_cast<internal::PlatformFileAttachment*>(attachment.get()) |
+ ->TakePlatformFile(), |
+ true)); |
+ return true; |
+} |
+ |
+void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p, |
+ std::string* l) { |
+ if (p.OwnershipPassesToIPC()) { |
+ l->append(base::StringPrintf("FD(%d auto-close)", p.GetHandle())); |
+ } else { |
+ l->append(base::StringPrintf("FD(%d)", p.GetHandle())); |
+ } |
+} |
#endif // defined(OS_MACOSX) && !defined(OS_IOS) |
void ParamTraits<base::FilePath>::GetSize(base::PickleSizer* sizer, |