| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "mojo/edk/system/channel.h" | 5 #include "mojo/edk/system/channel.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <limits> | 10 #include <limits> |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 | 46 |
| 47 size_t extra_header_size = 0; | 47 size_t extra_header_size = 0; |
| 48 #if defined(OS_WIN) | 48 #if defined(OS_WIN) |
| 49 // On Windows we serialize platform handles into the extra header space. | 49 // On Windows we serialize platform handles into the extra header space. |
| 50 extra_header_size = max_handles_ * sizeof(PlatformHandle); | 50 extra_header_size = max_handles_ * sizeof(PlatformHandle); |
| 51 #elif defined(OS_MACOSX) && !defined(OS_IOS) | 51 #elif defined(OS_MACOSX) && !defined(OS_IOS) |
| 52 // On OSX, some of the platform handles may be mach ports, which are | 52 // On OSX, some of the platform handles may be mach ports, which are |
| 53 // serialised into the message buffer. Since there could be a mix of fds and | 53 // serialised into the message buffer. Since there could be a mix of fds and |
| 54 // mach ports, we store the mach ports as an <index, port> pair (of uint32_t), | 54 // mach ports, we store the mach ports as an <index, port> pair (of uint32_t), |
| 55 // so that the original ordering of handles can be re-created. | 55 // so that the original ordering of handles can be re-created. |
| 56 extra_header_size = max_handles * sizeof(MachPortsEntry); | 56 if (max_handles) { |
| 57 extra_header_size = |
| 58 sizeof(MachPortsExtraHeader) + (max_handles * sizeof(MachPortsEntry)); |
| 59 } |
| 57 #endif | 60 #endif |
| 58 // Pad extra header data to be aliged to |kChannelMessageAlignment| bytes. | 61 // Pad extra header data to be aliged to |kChannelMessageAlignment| bytes. |
| 59 if (extra_header_size % kChannelMessageAlignment) { | 62 if (extra_header_size % kChannelMessageAlignment) { |
| 60 extra_header_size += kChannelMessageAlignment - | 63 extra_header_size += kChannelMessageAlignment - |
| 61 (extra_header_size % kChannelMessageAlignment); | 64 (extra_header_size % kChannelMessageAlignment); |
| 62 } | 65 } |
| 63 DCHECK_EQ(0u, extra_header_size % kChannelMessageAlignment); | 66 DCHECK_EQ(0u, extra_header_size % kChannelMessageAlignment); |
| 64 #if defined(OS_CHROMEOS) || defined(OS_ANDROID) | 67 #if defined(OS_CHROMEOS) || defined(OS_ANDROID) |
| 65 DCHECK_EQ(0u, extra_header_size); | 68 DCHECK_EQ(0u, extra_header_size); |
| 66 #endif | 69 #endif |
| (...skipping 22 matching lines...) Expand all Loading... |
| 89 static_cast<uint16_t>(sizeof(Header) + extra_header_size); | 92 static_cast<uint16_t>(sizeof(Header) + extra_header_size); |
| 90 #endif | 93 #endif |
| 91 | 94 |
| 92 if (max_handles_ > 0) { | 95 if (max_handles_ > 0) { |
| 93 #if defined(OS_WIN) | 96 #if defined(OS_WIN) |
| 94 handles_ = reinterpret_cast<PlatformHandle*>(mutable_extra_header()); | 97 handles_ = reinterpret_cast<PlatformHandle*>(mutable_extra_header()); |
| 95 // Initialize all handles to invalid values. | 98 // Initialize all handles to invalid values. |
| 96 for (size_t i = 0; i < max_handles_; ++i) | 99 for (size_t i = 0; i < max_handles_; ++i) |
| 97 handles()[i] = PlatformHandle(); | 100 handles()[i] = PlatformHandle(); |
| 98 #elif defined(OS_MACOSX) && !defined(OS_IOS) | 101 #elif defined(OS_MACOSX) && !defined(OS_IOS) |
| 99 mach_ports_ = reinterpret_cast<MachPortsEntry*>(mutable_extra_header()); | 102 mach_ports_header_ = |
| 103 reinterpret_cast<MachPortsExtraHeader*>(mutable_extra_header()); |
| 104 mach_ports_header_->num_ports = 0; |
| 100 // Initialize all handles to invalid values. | 105 // Initialize all handles to invalid values. |
| 101 for (size_t i = 0; i < max_handles_; ++i) | 106 for (size_t i = 0; i < max_handles_; ++i) { |
| 102 mach_ports_[i] = {0, static_cast<uint32_t>(MACH_PORT_NULL)}; | 107 mach_ports_header_->entries[i] = |
| 108 {0, static_cast<uint32_t>(MACH_PORT_NULL)}; |
| 109 } |
| 103 #endif | 110 #endif |
| 104 } | 111 } |
| 105 } | 112 } |
| 106 | 113 |
| 107 Channel::Message::~Message() { | 114 Channel::Message::~Message() { |
| 108 #if defined(OS_WIN) | 115 #if defined(OS_WIN) |
| 109 // On POSIX the ScopedPlatformHandleVectorPtr will do this for us. | 116 // On POSIX the ScopedPlatformHandleVectorPtr will do this for us. |
| 110 for (size_t i = 0; i < header_->num_handles; ++i) | 117 for (size_t i = 0; i < header_->num_handles; ++i) |
| 111 handles()[i].CloseIfNecessary(); | 118 handles()[i].CloseIfNecessary(); |
| 112 #endif | 119 #endif |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 memcpy(handles(), new_handles->data(), | 241 memcpy(handles(), new_handles->data(), |
| 235 sizeof(PlatformHandle) * new_handles->size()); | 242 sizeof(PlatformHandle) * new_handles->size()); |
| 236 new_handles->clear(); | 243 new_handles->clear(); |
| 237 #else | 244 #else |
| 238 std::swap(handle_vector_, new_handles); | 245 std::swap(handle_vector_, new_handles); |
| 239 #endif // defined(OS_WIN) | 246 #endif // defined(OS_WIN) |
| 240 #endif // defined(OS_CHROMEOS) || defined(OS_ANDROID) | 247 #endif // defined(OS_CHROMEOS) || defined(OS_ANDROID) |
| 241 | 248 |
| 242 #if defined(OS_MACOSX) && !defined(OS_IOS) | 249 #if defined(OS_MACOSX) && !defined(OS_IOS) |
| 243 size_t mach_port_index = 0; | 250 size_t mach_port_index = 0; |
| 244 for (size_t i = 0; i < max_handles_; ++i) | 251 if (mach_ports_header_) { |
| 245 mach_ports_[i] = {0, static_cast<uint32_t>(MACH_PORT_NULL)}; | 252 for (size_t i = 0; i < max_handles_; ++i) { |
| 246 for (size_t i = 0; i < handle_vector_->size(); i++) { | 253 mach_ports_header_->entries[i] = |
| 247 if ((*handle_vector_)[i].type == PlatformHandle::Type::MACH || | 254 {0, static_cast<uint32_t>(MACH_PORT_NULL)}; |
| 248 (*handle_vector_)[i].type == PlatformHandle::Type::MACH_NAME) { | |
| 249 mach_port_t port = (*handle_vector_)[i].port; | |
| 250 mach_ports_[mach_port_index].index = i; | |
| 251 mach_ports_[mach_port_index].mach_port = port; | |
| 252 mach_port_index++; | |
| 253 } | 255 } |
| 256 for (size_t i = 0; i < handle_vector_->size(); i++) { |
| 257 if ((*handle_vector_)[i].type == PlatformHandle::Type::MACH || |
| 258 (*handle_vector_)[i].type == PlatformHandle::Type::MACH_NAME) { |
| 259 mach_port_t port = (*handle_vector_)[i].port; |
| 260 mach_ports_header_->entries[mach_port_index].index = i; |
| 261 mach_ports_header_->entries[mach_port_index].mach_port = port; |
| 262 mach_port_index++; |
| 263 } |
| 264 } |
| 265 mach_ports_header_->num_ports = static_cast<uint16_t>(mach_port_index); |
| 254 } | 266 } |
| 255 #endif | 267 #endif |
| 256 } | 268 } |
| 257 | 269 |
| 258 ScopedPlatformHandleVectorPtr Channel::Message::TakeHandles() { | 270 ScopedPlatformHandleVectorPtr Channel::Message::TakeHandles() { |
| 259 #if defined(OS_WIN) | 271 #if defined(OS_WIN) |
| 260 if (header_->num_handles == 0) | 272 if (header_->num_handles == 0) |
| 261 return ScopedPlatformHandleVectorPtr(); | 273 return ScopedPlatformHandleVectorPtr(); |
| 262 ScopedPlatformHandleVectorPtr moved_handles( | 274 ScopedPlatformHandleVectorPtr moved_handles( |
| 263 new PlatformHandleVector(header_->num_handles)); | 275 new PlatformHandleVector(header_->num_handles)); |
| 264 for (size_t i = 0; i < header_->num_handles; ++i) | 276 for (size_t i = 0; i < header_->num_handles; ++i) |
| 265 std::swap(moved_handles->at(i), handles()[i]); | 277 std::swap(moved_handles->at(i), handles()[i]); |
| 266 header_->num_handles = 0; | 278 header_->num_handles = 0; |
| 267 return moved_handles; | 279 return moved_handles; |
| 268 #elif defined(OS_MACOSX) && !defined(OS_IOS) | 280 #elif defined(OS_MACOSX) && !defined(OS_IOS) |
| 269 for (size_t i = 0; i < max_handles_; ++i) | 281 if (mach_ports_header_) { |
| 270 mach_ports_[i] = {0, static_cast<uint32_t>(MACH_PORT_NULL)}; | 282 for (size_t i = 0; i < max_handles_; ++i) { |
| 283 mach_ports_header_->entries[i] = |
| 284 {0, static_cast<uint32_t>(MACH_PORT_NULL)}; |
| 285 } |
| 286 mach_ports_header_->num_ports = 0; |
| 287 } |
| 271 header_->num_handles = 0; | 288 header_->num_handles = 0; |
| 272 return std::move(handle_vector_); | 289 return std::move(handle_vector_); |
| 273 #else | 290 #else |
| 274 header_->num_handles = 0; | 291 header_->num_handles = 0; |
| 275 return std::move(handle_vector_); | 292 return std::move(handle_vector_); |
| 276 #endif | 293 #endif |
| 277 } | 294 } |
| 278 | 295 |
| 279 ScopedPlatformHandleVectorPtr Channel::Message::TakeHandlesForTransport() { | 296 ScopedPlatformHandleVectorPtr Channel::Message::TakeHandlesForTransport() { |
| 280 #if defined(OS_WIN) | 297 #if defined(OS_WIN) |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 return true; | 540 return true; |
| 524 } | 541 } |
| 525 | 542 |
| 526 void Channel::OnError() { | 543 void Channel::OnError() { |
| 527 if (delegate_) | 544 if (delegate_) |
| 528 delegate_->OnChannelError(); | 545 delegate_->OnChannelError(); |
| 529 } | 546 } |
| 530 | 547 |
| 531 } // namespace edk | 548 } // namespace edk |
| 532 } // namespace mojo | 549 } // namespace mojo |
| OLD | NEW |