| Index: mojo/edk/system/child_broker.cc
|
| diff --git a/mojo/edk/system/child_broker.cc b/mojo/edk/system/child_broker.cc
|
| index d86f1ad44e376195d13daac06e2b63513f3099ec..7a79173f7446a3f9b4ece3d22263f451ea1f2f49 100644
|
| --- a/mojo/edk/system/child_broker.cc
|
| +++ b/mojo/edk/system/child_broker.cc
|
| @@ -13,17 +13,9 @@
|
| #include "base/logging.h"
|
| #include "mojo/edk/embedder/embedder_internal.h"
|
| #include "mojo/edk/embedder/platform_channel_pair.h"
|
| -#include "mojo/edk/embedder/platform_shared_buffer.h"
|
| -#include "mojo/edk/embedder/platform_support.h"
|
| #include "mojo/edk/system/broker_messages.h"
|
| #include "mojo/edk/system/message_pipe_dispatcher.h"
|
|
|
| -#if defined(OS_POSIX)
|
| -#include <fcntl.h>
|
| -
|
| -#include "mojo/edk/embedder/platform_channel_utils_posix.h"
|
| -#endif
|
| -
|
| namespace mojo {
|
| namespace edk {
|
|
|
| @@ -34,36 +26,24 @@ ChildBroker* ChildBroker::GetInstance() {
|
|
|
| void ChildBroker::SetChildBrokerHostHandle(ScopedPlatformHandle handle) {
|
| ScopedPlatformHandle parent_async_channel_handle;
|
| - parent_sync_channel_ = std::move(handle);
|
| -
|
| -// We have two pipes to the parent. The first is for the token
|
| -// exchange for creating and passing handles on Windows, and creating shared
|
| -// buffers on POSIX, since the child needs the parent's help if it is
|
| -// sandboxed. The second is used for multiplexing related messages. We
|
| -// send the second over the first.
|
| #if defined(OS_POSIX)
|
| - // Make the synchronous channel blocking.
|
| - int flags = fcntl(parent_sync_channel_.get().handle, F_GETFL, 0);
|
| - PCHECK(flags != -1);
|
| - PCHECK(fcntl(parent_sync_channel_.get().handle, F_SETFL,
|
| - flags & ~O_NONBLOCK) != -1);
|
| -
|
| - std::deque<PlatformHandle> received_handles;
|
| - char buf[1];
|
| - ssize_t result = PlatformChannelRecvmsg(parent_sync_channel_.get(), buf, 1,
|
| - &received_handles, true);
|
| - CHECK_EQ(1, result);
|
| - CHECK_EQ(1u, received_handles.size());
|
| - parent_async_channel_handle.reset(received_handles.front());
|
| + parent_async_channel_handle = std::move(handle);
|
| #else
|
| + // On Windows we have two pipes to the parent. The first is for the token
|
| + // exchange for creating and passing handles, since the child needs the
|
| + // parent's help if it is sandboxed. The second is the same as POSIX, which is
|
| + // used for multiplexing related messages. So on Windows, we send the second
|
| + // pipe as the first string over the first one.
|
| + parent_sync_channel_ = std::move(handle);
|
| +
|
| HANDLE parent_handle = INVALID_HANDLE_VALUE;
|
| DWORD bytes_read = 0;
|
| BOOL rv = ReadFile(parent_sync_channel_.get().handle, &parent_handle,
|
| sizeof(parent_handle), &bytes_read, NULL);
|
| CHECK(rv);
|
| parent_async_channel_handle.reset(PlatformHandle(parent_handle));
|
| -#endif
|
| sync_channel_lock_.Unlock();
|
| +#endif
|
|
|
| internal::g_io_thread_task_runner->PostTask(
|
| FROM_HERE,
|
| @@ -119,29 +99,6 @@ void ChildBroker::TokenToHandle(const uint64_t* tokens,
|
| sync_channel_lock_.Unlock();
|
| }
|
| }
|
| -#else
|
| -scoped_refptr<PlatformSharedBuffer> ChildBroker::CreateSharedBuffer(
|
| - size_t num_bytes) {
|
| - sync_channel_lock_.Lock();
|
| - scoped_refptr<PlatformSharedBuffer> shared_buffer;
|
| -
|
| - BrokerMessage message;
|
| - message.size = kBrokerMessageHeaderSize + sizeof(uint32_t);
|
| - message.id = CREATE_SHARED_BUFFER;
|
| - message.shared_buffer_size = num_bytes;
|
| -
|
| - std::deque<PlatformHandle> handles;
|
| - if (WriteAndReadHandles(&message, &handles)) {
|
| - DCHECK_EQ(1u, handles.size());
|
| - PlatformHandle handle = handles.front();
|
| - if (handle.is_valid())
|
| - shared_buffer =
|
| - internal::g_platform_support->CreateSharedBufferFromHandle(
|
| - num_bytes, ScopedPlatformHandle(handles.front()));
|
| - }
|
| - sync_channel_lock_.Unlock();
|
| - return shared_buffer;
|
| -}
|
| #endif
|
|
|
| void ChildBroker::ConnectMessagePipe(uint64_t pipe_id,
|
| @@ -215,8 +172,10 @@ ChildBroker::ChildBroker()
|
| in_process_pipes_channel2_(nullptr) {
|
| DCHECK(!internal::g_broker);
|
| internal::g_broker = this;
|
| +#if defined(OS_WIN)
|
| // Block any threads from calling this until we have a pipe to the parent.
|
| sync_channel_lock_.Lock();
|
| +#endif
|
| }
|
|
|
| ChildBroker::~ChildBroker() {
|
| @@ -337,21 +296,6 @@ void ChildBroker::AttachMessagePipe(MessagePipeDispatcher* message_pipe,
|
|
|
| #if defined(OS_WIN)
|
|
|
| -void ChildBroker::CreatePlatformChannelPairNoLock(
|
| - ScopedPlatformHandle* server,
|
| - ScopedPlatformHandle* client) {
|
| - BrokerMessage message;
|
| - message.size = kBrokerMessageHeaderSize;
|
| - message.id = CREATE_PLATFORM_CHANNEL_PAIR;
|
| -
|
| - uint32_t response_size = 2 * sizeof(HANDLE);
|
| - HANDLE handles[2];
|
| - if (WriteAndReadResponse(&message, handles, response_size)) {
|
| - server->reset(PlatformHandle(handles[0]));
|
| - client->reset(PlatformHandle(handles[1]));
|
| - }
|
| -}
|
| -
|
| bool ChildBroker::WriteAndReadResponse(BrokerMessage* message,
|
| void* response,
|
| uint32_t response_size) {
|
| @@ -383,35 +327,21 @@ bool ChildBroker::WriteAndReadResponse(BrokerMessage* message,
|
|
|
| return result;
|
| }
|
| -#else
|
| -bool ChildBroker::WriteAndReadHandles(BrokerMessage* message,
|
| - std::deque<PlatformHandle>* handles) {
|
| - CHECK(parent_sync_channel_.is_valid());
|
|
|
| - uint32_t remaining_bytes = message->size;
|
| - while (remaining_bytes > 0) {
|
| - ssize_t bytes_written = PlatformChannelWrite(
|
| - parent_sync_channel_.get(),
|
| - reinterpret_cast<uint8_t*>(message) + (message->size - remaining_bytes),
|
| - remaining_bytes);
|
| -
|
| - if (bytes_written != -1)
|
| - remaining_bytes -= bytes_written;
|
| - else
|
| - return false;
|
| +void ChildBroker::CreatePlatformChannelPairNoLock(
|
| + ScopedPlatformHandle* server, ScopedPlatformHandle* client) {
|
| + BrokerMessage message;
|
| + message.size = kBrokerMessageHeaderSize;
|
| + message.id = CREATE_PLATFORM_CHANNEL_PAIR;
|
| +
|
| + uint32_t response_size = 2 * sizeof(HANDLE);
|
| + HANDLE handles[2];
|
| + if (WriteAndReadResponse(&message, handles, response_size)) {
|
| + server->reset(PlatformHandle(handles[0]));
|
| + client->reset(PlatformHandle(handles[1]));
|
| }
|
| - // Perform a blocking read (we set this fd to be blocking in
|
| - // SetChildBrokerHostHandle).
|
| - char buf[1];
|
| - ssize_t bytes_read = PlatformChannelRecvmsg(
|
| - parent_sync_channel_.get(), buf, 1, handles, true /* should_block */);
|
| - // If the other side shutdown, or there was an error, or we didn't get
|
| - // any handles.
|
| - if (bytes_read == 0 || bytes_read == -1 || handles->empty())
|
| - return false;
|
| -
|
| - return true;
|
| }
|
| +
|
| #endif
|
|
|
| } // namespace edk
|
|
|