Chromium Code Reviews| Index: ipc/ipc_message_utils.cc |
| diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc |
| index f86022c691a09cded39dc2cd21928bcaca8b9646..171934c4e55f6dedbea29922dde262852fe92c49 100644 |
| --- a/ipc/ipc_message_utils.cc |
| +++ b/ipc/ipc_message_utils.cc |
| @@ -20,6 +20,10 @@ |
| #include "ipc/ipc_platform_file_attachment_posix.h" |
| #endif |
| +#if defined(OS_MACOSX) && !defined(OS_IOS) |
| +#include "base/memory/shared_memory_handle.h" |
| +#endif // defined(OS_MACOSX) && !defined(OS_IOS) |
| + |
| #if defined(OS_WIN) |
| #include <tchar.h> |
| #endif |
| @@ -516,6 +520,57 @@ void ParamTraits<base::FileDescriptor>::Log(const param_type& p, |
| } |
| #endif // defined(OS_POSIX) |
| +#if defined(OS_MACOSX) && !defined(OS_IOS) |
| +void ParamTraits<base::SharedMemoryHandle>::Write(Message* m, |
| + const param_type& p) { |
| + static_assert(sizeof(base::SharedMemoryHandle::Type) <= sizeof(int), |
|
Tom Sepez
2015/06/17 18:51:55
nit: this assert can go into the class body itself
erikchen
2015/06/18 17:58:33
Sure, done. I made a new type base::SharedMemoryHa
|
| + "Size of enum SharedMemoryHandle::Type exceeds size of type " |
| + "transmitted over wire."); |
| + m->WriteInt(p.GetType()); |
| + |
| + if (p.GetType() == base::SharedMemoryHandle::POSIX) |
| + ParamTraits<base::FileDescriptor>::Write(m, *p.GetFileDescriptor()); |
| +} |
| + |
| +bool ParamTraits<base::SharedMemoryHandle>::Read(const Message* m, |
| + base::PickleIterator* iter, |
| + param_type* r) { |
| + static_assert(sizeof(base::SharedMemoryHandle::Type) <= sizeof(int), |
|
Tom Sepez
2015/06/17 18:51:55
same here.
erikchen
2015/06/18 17:58:33
Done.
|
| + "Size of enum SharedMemoryHandle::Type exceeds size of type " |
| + "transmitted over wire."); |
| + int type; |
| + if (!iter->ReadInt(&type)) |
| + return false; |
| + |
| + switch (type) { |
| + case base::SharedMemoryHandle::POSIX: |
| + case base::SharedMemoryHandle::MACH: { |
| + base::SharedMemoryHandle::Type shm_type = |
| + static_cast<base::SharedMemoryHandle::Type>(type); |
| + r->SetType(shm_type); |
| + break; |
| + } |
| + default: |
| + return false; |
| + } |
| + |
| + if (r->GetType() == base::SharedMemoryHandle::POSIX) { |
| + return ParamTraits<base::FileDescriptor>::Read(m, iter, |
| + r->GetFileDescriptor()); |
| + } |
| + |
|
Tom Sepez
2015/06/17 18:51:55
The pattern for these kinds of classes is to not a
erikchen
2015/06/18 17:58:33
Ah, good suggestion. Done.
|
| + return true; |
| +} |
| + |
| +void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p, |
| + std::string* l) { |
| + if (p.GetType() == base::SharedMemoryHandle::POSIX) { |
| + l->append(base::StringPrintf("Mechanism POSIX Fd")); |
| + ParamTraits<base::FileDescriptor>::Log(*p.GetFileDescriptor(), l); |
| + } |
| +} |
| +#endif // defined(OS_MACOSX) && !defined(OS_IOS) |
| + |
| void ParamTraits<base::FilePath>::Write(Message* m, const param_type& p) { |
| p.WriteToPickle(m); |
| } |