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

Unified Diff: mojo/public/cpp/bindings/lib/connector.h

Issue 1455063004: Mojo C++ bindings: introduce MultiplexRouter and related classes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years, 1 month 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/public/cpp/bindings/BUILD.gn ('k') | mojo/public/cpp/bindings/lib/connector.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/public/cpp/bindings/lib/connector.h
diff --git a/mojo/public/cpp/bindings/lib/connector.h b/mojo/public/cpp/bindings/lib/connector.h
index 185a98446d015810a0b91e2cf813459bb63e2d2b..3978171101ce0d8f7368954b37ee29171a4e3b67 100644
--- a/mojo/public/cpp/bindings/lib/connector.h
+++ b/mojo/public/cpp/bindings/lib/connector.h
@@ -5,15 +5,19 @@
#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_CONNECTOR_H_
#define MOJO_PUBLIC_CPP_BINDINGS_LIB_CONNECTOR_H_
+#include "base/memory/scoped_ptr.h"
+#include "base/threading/thread_checker.h"
#include "mojo/public/c/environment/async_waiter.h"
#include "mojo/public/cpp/bindings/callback.h"
#include "mojo/public/cpp/bindings/message.h"
#include "mojo/public/cpp/environment/environment.h"
#include "mojo/public/cpp/system/core.h"
-namespace mojo {
-class ErrorHandler;
+namespace base {
+class Lock;
+}
+namespace mojo {
namespace internal {
// The Connector class is responsible for performing read/write operations on a
@@ -21,13 +25,24 @@ namespace internal {
// interface that it subclasses, and it forwards messages it reads through the
// MessageReceiver interface assigned as its incoming receiver.
//
-// NOTE: MessagePipe I/O is non-blocking.
-//
+// NOTE:
+// - MessagePipe I/O is non-blocking.
+// - Sending messages can be configured to be thread safe (please see comments
+// of the constructor). Other than that, the object should only be accessed
+// on the creating thread.
class Connector : public MessageReceiver {
public:
+ enum ConnectorConfig {
+ // Connector::Accept() is only called from a single thread.
+ SINGLE_THREADED_SEND,
+ // Connector::Accept() is allowed to be called from multiple threads.
+ MULTI_THREADED_SEND
+ };
+
// The Connector takes ownership of |message_pipe|.
- explicit Connector(
+ Connector(
ScopedMessagePipeHandle message_pipe,
+ ConnectorConfig config,
const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter());
~Connector() override;
@@ -35,6 +50,7 @@ class Connector : public MessageReceiver {
// Connector will read messages from the pipe regardless of whether or not an
// incoming receiver has been set.
void set_incoming_receiver(MessageReceiver* receiver) {
+ DCHECK(thread_checker_.CalledOnValidThread());
incoming_receiver_ = receiver;
}
@@ -42,18 +58,23 @@ class Connector : public MessageReceiver {
// state, where no more messages will be processed. This method is used
// during testing to prevent that from happening.
void set_enforce_errors_from_incoming_receiver(bool enforce) {
+ DCHECK(thread_checker_.CalledOnValidThread());
enforce_errors_from_incoming_receiver_ = enforce;
}
// Sets the error handler to receive notifications when an error is
// encountered while reading from the pipe or waiting to read from the pipe.
void set_connection_error_handler(const Closure& error_handler) {
+ DCHECK(thread_checker_.CalledOnValidThread());
connection_error_handler_ = error_handler;
}
// Returns true if an error was encountered while reading from the pipe or
// waiting to read from the pipe.
- bool encountered_error() const { return error_; }
+ bool encountered_error() const {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ return error_;
+ }
// Closes the pipe. The connector is put into a quiescent state.
//
@@ -78,7 +99,10 @@ class Connector : public MessageReceiver {
void RaiseError();
// Is the connector bound to a MessagePipe handle?
- bool is_valid() const { return message_pipe_.is_valid(); }
+ bool is_valid() const {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ return message_pipe_.is_valid();
+ }
// Waits for the next message on the pipe, blocking until one arrives,
// |deadline| elapses, or an error happens. Returns |true| if a message has
@@ -92,7 +116,10 @@ class Connector : public MessageReceiver {
// MessageReceiver implementation:
bool Accept(Message* message) override;
- MessagePipeHandle handle() const { return message_pipe_.get(); }
+ MessagePipeHandle handle() const {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ return message_pipe_.get();
+ }
private:
static void CallOnHandleReady(void* closure, MojoResult result);
@@ -133,6 +160,12 @@ class Connector : public MessageReceiver {
// of dispatching an incoming message.
bool* destroyed_flag_;
+ // If sending messages is allowed from multiple threads, |lock_| is used to
+ // protect modifications to |message_pipe_| and |drop_writes_|.
+ scoped_ptr<base::Lock> lock_;
+
+ base::ThreadChecker thread_checker_;
+
MOJO_DISALLOW_COPY_AND_ASSIGN(Connector);
};
« no previous file with comments | « mojo/public/cpp/bindings/BUILD.gn ('k') | mojo/public/cpp/bindings/lib/connector.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698