Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Unified Diff: mojo/edk/system/broker_host.cc

Issue 2264543003: Adds sync brokering to Windows EDK (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/edk/system/broker_host.h ('k') | mojo/edk/system/broker_host_posix.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/edk/system/broker_host.cc
diff --git a/mojo/edk/system/broker_host_posix.cc b/mojo/edk/system/broker_host.cc
similarity index 71%
rename from mojo/edk/system/broker_host_posix.cc
rename to mojo/edk/system/broker_host.cc
index ed8e213c1c0d04a8a3102301861e541473a27276..5b2071ad19f3496d0eb4c562419c4e18d09e3119 100644
--- a/mojo/edk/system/broker_host_posix.cc
+++ b/mojo/edk/system/broker_host.cc
@@ -4,17 +4,12 @@
#include "mojo/edk/system/broker_host.h"
-#include <fcntl.h>
-#include <unistd.h>
-
#include <utility>
#include "base/logging.h"
#include "base/memory/ref_counted.h"
#include "base/message_loop/message_loop.h"
#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/embedder/platform_channel_utils_posix.h"
#include "mojo/edk/embedder/platform_handle_vector.h"
#include "mojo/edk/embedder/platform_shared_buffer.h"
#include "mojo/edk/system/broker_messages.h"
@@ -23,18 +18,25 @@ namespace mojo {
namespace edk {
namespace {
+
// To prevent abuse, limit the maximum size of shared memory buffers.
-// TODO(amistry): Re-consider this limit, or do something smarter.
-const size_t kMaxSharedBufferSize = 16 * 1024 * 1024;
-}
+// TODO(rockot): Re-consider this limit, or do something smarter.
+const uint32_t kMaxSharedBufferSize = 16 * 1024 * 1024;
+
+} // namespace
-BrokerHost::BrokerHost(ScopedPlatformHandle platform_handle) {
+BrokerHost::BrokerHost(base::ProcessHandle client_process,
+ ScopedPlatformHandle platform_handle)
+#if defined(OS_WIN)
+ : client_process_(client_process)
+#endif
+{
CHECK(platform_handle.is_valid());
base::MessageLoop::current()->AddDestructionObserver(this);
- channel_ = Channel::Create(this, std::move(platform_handle),
- base::ThreadTaskRunnerHandle::Get());
+ channel_ = Channel::Create(
+ this, std::move(platform_handle), base::ThreadTaskRunnerHandle::Get());
channel_->Start();
}
@@ -46,6 +48,18 @@ BrokerHost::~BrokerHost() {
channel_->ShutDown();
}
+void BrokerHost::PrepareHandlesForClient(PlatformHandleVector* handles) {
+#if defined(OS_WIN)
+ if (!Channel::Message::RewriteHandles(
+ base::GetCurrentProcessHandle(), client_process_, handles)) {
+ // NOTE: We only log an error here. We do not signal a logical error or
+ // prevent any message from being sent. The client should handle unexpected
+ // invalid handles appropriately.
+ DLOG(ERROR) << "Failed to rewrite one or more handles to broker client.";
+ }
+#endif
+}
+
void BrokerHost::SendChannel(ScopedPlatformHandle handle) {
CHECK(handle.is_valid());
CHECK(channel_);
@@ -55,12 +69,12 @@ void BrokerHost::SendChannel(ScopedPlatformHandle handle) {
ScopedPlatformHandleVectorPtr handles;
handles.reset(new PlatformHandleVector(1));
handles->at(0) = handle.release();
+ PrepareHandlesForClient(handles.get());
message->SetHandles(std::move(handles));
-
channel_->Write(std::move(message));
}
-void BrokerHost::OnBufferRequest(size_t num_bytes) {
+void BrokerHost::OnBufferRequest(uint32_t num_bytes) {
scoped_refptr<PlatformSharedBuffer> buffer;
scoped_refptr<PlatformSharedBuffer> read_only_buffer;
if (num_bytes <= kMaxSharedBufferSize) {
@@ -80,6 +94,7 @@ void BrokerHost::OnBufferRequest(size_t num_bytes) {
handles.reset(new PlatformHandleVector(2));
handles->at(0) = buffer->PassPlatformHandle().release();
handles->at(1) = read_only_buffer->PassPlatformHandle().release();
+ PrepareHandlesForClient(handles.get());
message->SetHandles(std::move(handles));
}
@@ -101,29 +116,18 @@ void BrokerHost::OnChannelMessage(const void* payload,
const BufferRequestData* request =
reinterpret_cast<const BufferRequestData*>(header + 1);
OnBufferRequest(request->size);
- return;
}
break;
default:
+ LOG(ERROR) << "Unexpected broker message type: " << header->type;
break;
}
-
- LOG(ERROR) << "Unexpected broker message type: " << header->type;
}
-void BrokerHost::OnChannelError() {
- if (channel_) {
- channel_->ShutDown();
- channel_ = nullptr;
- }
+void BrokerHost::OnChannelError() { delete this; }
- delete this;
-}
-
-void BrokerHost::WillDestroyCurrentMessageLoop() {
- delete this;
-}
+void BrokerHost::WillDestroyCurrentMessageLoop() { delete this; }
} // namespace edk
} // namespace mojo
« no previous file with comments | « mojo/edk/system/broker_host.h ('k') | mojo/edk/system/broker_host_posix.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698