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

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

Issue 1350023003: Add a Mojo EDK for Chrome that uses one OS pipe per message pipe. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: more cleanup Created 5 years, 2 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
Index: mojo/edk/system/dispatcher.cc
diff --git a/third_party/mojo/src/mojo/edk/system/dispatcher.cc b/mojo/edk/system/dispatcher.cc
similarity index 70%
copy from third_party/mojo/src/mojo/edk/system/dispatcher.cc
copy to mojo/edk/system/dispatcher.cc
index b4487579a3474837ce95df610d0e8a2784791bb3..e7426e513f284b9becdb38f31f72d4cb8bd0c331 100644
--- a/third_party/mojo/src/mojo/edk/system/dispatcher.cc
+++ b/mojo/edk/system/dispatcher.cc
@@ -2,18 +2,18 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "third_party/mojo/src/mojo/edk/system/dispatcher.h"
+#include "mojo/edk/system/dispatcher.h"
#include "base/logging.h"
-#include "third_party/mojo/src/mojo/edk/system/configuration.h"
-#include "third_party/mojo/src/mojo/edk/system/data_pipe_consumer_dispatcher.h"
-#include "third_party/mojo/src/mojo/edk/system/data_pipe_producer_dispatcher.h"
-#include "third_party/mojo/src/mojo/edk/system/message_pipe_dispatcher.h"
-#include "third_party/mojo/src/mojo/edk/system/platform_handle_dispatcher.h"
-#include "third_party/mojo/src/mojo/edk/system/shared_buffer_dispatcher.h"
+#include "mojo/edk/system/configuration.h"
+#include "mojo/edk/system/data_pipe_consumer_dispatcher.h"
+#include "mojo/edk/system/data_pipe_producer_dispatcher.h"
+#include "mojo/edk/system/message_pipe_dispatcher.h"
+#include "mojo/edk/system/platform_handle_dispatcher.h"
+#include "mojo/edk/system/shared_buffer_dispatcher.h"
namespace mojo {
-namespace system {
+namespace edk {
namespace test {
@@ -26,18 +26,22 @@ DispatcherTransport DispatcherTryStartTransport(Dispatcher* dispatcher) {
// Dispatcher ------------------------------------------------------------------
-// TODO(vtl): The thread-safety analyzer isn't smart enough to deal with the
-// fact that we give up if |TryLock()| fails.
// static
DispatcherTransport Dispatcher::HandleTableAccess::TryStartTransport(
- Dispatcher* dispatcher) MOJO_NO_THREAD_SAFETY_ANALYSIS {
+ Dispatcher* dispatcher) {
DCHECK(dispatcher);
- if (!dispatcher->mutex_.TryLock())
- return DispatcherTransport();
+ // Our dispatcher implementations hop to IO thread on initialization, so it's
+ // valid that while their RawChannel os being initialized on IO thread, the
+ // dispatcher is being sent. We handle this by just acquiring the lock.
+
+ // See comment in header for why we need this.
+ dispatcher->TransportStarted();
+
+ dispatcher->lock_.Acquire();
// We shouldn't race with things that close dispatchers, since closing can
- // only take place either under |handle_table_mutex_| or when the handle is
+ // only take place either under |handle_table_lock_| or when the handle is
// marked as busy.
DCHECK(!dispatcher->is_closed_);
@@ -47,58 +51,57 @@ DispatcherTransport Dispatcher::HandleTableAccess::TryStartTransport(
// static
void Dispatcher::TransportDataAccess::StartSerialize(
Dispatcher* dispatcher,
- Channel* channel,
size_t* max_size,
size_t* max_platform_handles) {
DCHECK(dispatcher);
- dispatcher->StartSerialize(channel, max_size, max_platform_handles);
+ dispatcher->StartSerialize(max_size, max_platform_handles);
}
// static
bool Dispatcher::TransportDataAccess::EndSerializeAndClose(
Dispatcher* dispatcher,
- Channel* channel,
void* destination,
size_t* actual_size,
- embedder::PlatformHandleVector* platform_handles) {
+ PlatformHandleVector* platform_handles) {
DCHECK(dispatcher);
- return dispatcher->EndSerializeAndClose(channel, destination, actual_size,
+ return dispatcher->EndSerializeAndClose(destination, actual_size,
platform_handles);
}
// static
scoped_refptr<Dispatcher> Dispatcher::TransportDataAccess::Deserialize(
- Channel* channel,
int32_t type,
const void* source,
size_t size,
- embedder::PlatformHandleVector* platform_handles) {
+ PlatformHandleVector* platform_handles) {
switch (static_cast<Dispatcher::Type>(type)) {
case Type::UNKNOWN:
DVLOG(2) << "Deserializing invalid handle";
return nullptr;
case Type::MESSAGE_PIPE:
- return scoped_refptr<Dispatcher>(
- MessagePipeDispatcher::Deserialize(channel, source, size));
+ return scoped_refptr<Dispatcher>(MessagePipeDispatcher::Deserialize(
+ source, size, platform_handles));
case Type::DATA_PIPE_PRODUCER:
return scoped_refptr<Dispatcher>(
- DataPipeProducerDispatcher::Deserialize(channel, source, size));
+ DataPipeProducerDispatcher::Deserialize(
+ source, size, platform_handles));
case Type::DATA_PIPE_CONSUMER:
return scoped_refptr<Dispatcher>(
- DataPipeConsumerDispatcher::Deserialize(channel, source, size));
+ DataPipeConsumerDispatcher::Deserialize(
+ source, size, platform_handles));
case Type::SHARED_BUFFER:
return scoped_refptr<Dispatcher>(SharedBufferDispatcher::Deserialize(
- channel, source, size, platform_handles));
+ source, size, platform_handles));
case Type::PLATFORM_HANDLE:
return scoped_refptr<Dispatcher>(PlatformHandleDispatcher::Deserialize(
- channel, source, size, platform_handles));
+ source, size, platform_handles));
}
LOG(WARNING) << "Unknown dispatcher type " << type;
return nullptr;
}
MojoResult Dispatcher::Close() {
- MutexLocker locker(&mutex_);
+ base::AutoLock locker(lock_);
if (is_closed_)
return MOJO_RESULT_INVALID_ARGUMENT;
@@ -107,7 +110,7 @@ MojoResult Dispatcher::Close() {
}
MojoResult Dispatcher::WriteMessage(
- UserPointer<const void> bytes,
+ const void* bytes,
uint32_t num_bytes,
std::vector<DispatcherTransport>* transports,
MojoWriteMessageFlags flags) {
@@ -115,22 +118,22 @@ MojoResult Dispatcher::WriteMessage(
(transports->size() > 0 &&
transports->size() < GetConfiguration().max_message_num_handles));
- MutexLocker locker(&mutex_);
+ base::AutoLock locker(lock_);
if (is_closed_)
return MOJO_RESULT_INVALID_ARGUMENT;
return WriteMessageImplNoLock(bytes, num_bytes, transports, flags);
}
-MojoResult Dispatcher::ReadMessage(UserPointer<void> bytes,
- UserPointer<uint32_t> num_bytes,
+MojoResult Dispatcher::ReadMessage(void* bytes,
+ uint32_t* num_bytes,
DispatcherVector* dispatchers,
uint32_t* num_dispatchers,
MojoReadMessageFlags flags) {
DCHECK(!num_dispatchers || *num_dispatchers == 0 ||
(dispatchers && dispatchers->empty()));
- MutexLocker locker(&mutex_);
+ base::AutoLock locker(lock_);
if (is_closed_)
return MOJO_RESULT_INVALID_ARGUMENT;
@@ -138,20 +141,20 @@ MojoResult Dispatcher::ReadMessage(UserPointer<void> bytes,
flags);
}
-MojoResult Dispatcher::WriteData(UserPointer<const void> elements,
- UserPointer<uint32_t> num_bytes,
+MojoResult Dispatcher::WriteData(const void* elements,
+ uint32_t* num_bytes,
MojoWriteDataFlags flags) {
- MutexLocker locker(&mutex_);
+ base::AutoLock locker(lock_);
if (is_closed_)
return MOJO_RESULT_INVALID_ARGUMENT;
return WriteDataImplNoLock(elements, num_bytes, flags);
}
-MojoResult Dispatcher::BeginWriteData(UserPointer<void*> buffer,
- UserPointer<uint32_t> buffer_num_bytes,
+MojoResult Dispatcher::BeginWriteData(void** buffer,
+ uint32_t* buffer_num_bytes,
MojoWriteDataFlags flags) {
- MutexLocker locker(&mutex_);
+ base::AutoLock locker(lock_);
if (is_closed_)
return MOJO_RESULT_INVALID_ARGUMENT;
@@ -159,27 +162,27 @@ MojoResult Dispatcher::BeginWriteData(UserPointer<void*> buffer,
}
MojoResult Dispatcher::EndWriteData(uint32_t num_bytes_written) {
- MutexLocker locker(&mutex_);
+ base::AutoLock locker(lock_);
if (is_closed_)
return MOJO_RESULT_INVALID_ARGUMENT;
return EndWriteDataImplNoLock(num_bytes_written);
}
-MojoResult Dispatcher::ReadData(UserPointer<void> elements,
- UserPointer<uint32_t> num_bytes,
+MojoResult Dispatcher::ReadData(void* elements,
+ uint32_t* num_bytes,
MojoReadDataFlags flags) {
- MutexLocker locker(&mutex_);
+ base::AutoLock locker(lock_);
if (is_closed_)
return MOJO_RESULT_INVALID_ARGUMENT;
return ReadDataImplNoLock(elements, num_bytes, flags);
}
-MojoResult Dispatcher::BeginReadData(UserPointer<const void*> buffer,
- UserPointer<uint32_t> buffer_num_bytes,
+MojoResult Dispatcher::BeginReadData(const void** buffer,
+ uint32_t* buffer_num_bytes,
MojoReadDataFlags flags) {
- MutexLocker locker(&mutex_);
+ base::AutoLock locker(lock_);
if (is_closed_)
return MOJO_RESULT_INVALID_ARGUMENT;
@@ -187,7 +190,7 @@ MojoResult Dispatcher::BeginReadData(UserPointer<const void*> buffer,
}
MojoResult Dispatcher::EndReadData(uint32_t num_bytes_read) {
- MutexLocker locker(&mutex_);
+ base::AutoLock locker(lock_);
if (is_closed_)
return MOJO_RESULT_INVALID_ARGUMENT;
@@ -195,9 +198,9 @@ MojoResult Dispatcher::EndReadData(uint32_t num_bytes_read) {
}
MojoResult Dispatcher::DuplicateBufferHandle(
- UserPointer<const MojoDuplicateBufferHandleOptions> options,
+ const MojoDuplicateBufferHandleOptions* options,
scoped_refptr<Dispatcher>* new_dispatcher) {
- MutexLocker locker(&mutex_);
+ base::AutoLock locker(lock_);
if (is_closed_)
return MOJO_RESULT_INVALID_ARGUMENT;
@@ -208,8 +211,8 @@ MojoResult Dispatcher::MapBuffer(
uint64_t offset,
uint64_t num_bytes,
MojoMapBufferFlags flags,
- scoped_ptr<embedder::PlatformSharedBufferMapping>* mapping) {
- MutexLocker locker(&mutex_);
+ scoped_ptr<PlatformSharedBufferMapping>* mapping) {
+ base::AutoLock locker(lock_);
if (is_closed_)
return MOJO_RESULT_INVALID_ARGUMENT;
@@ -217,7 +220,7 @@ MojoResult Dispatcher::MapBuffer(
}
HandleSignalsState Dispatcher::GetHandleSignalsState() const {
- MutexLocker locker(&mutex_);
+ base::AutoLock locker(lock_);
if (is_closed_)
return HandleSignalsState();
@@ -228,7 +231,7 @@ MojoResult Dispatcher::AddAwakable(Awakable* awakable,
MojoHandleSignals signals,
uint32_t context,
HandleSignalsState* signals_state) {
- MutexLocker locker(&mutex_);
+ base::AutoLock locker(lock_);
if (is_closed_) {
if (signals_state)
*signals_state = HandleSignalsState();
@@ -240,7 +243,7 @@ MojoResult Dispatcher::AddAwakable(Awakable* awakable,
void Dispatcher::RemoveAwakable(Awakable* awakable,
HandleSignalsState* handle_signals_state) {
- MutexLocker locker(&mutex_);
+ base::AutoLock locker(lock_);
if (is_closed_) {
if (handle_signals_state)
*handle_signals_state = HandleSignalsState();
@@ -259,98 +262,98 @@ Dispatcher::~Dispatcher() {
}
void Dispatcher::CancelAllAwakablesNoLock() {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(is_closed_);
// By default, waiting isn't supported. Only dispatchers that can be waited on
// will do something nontrivial.
}
void Dispatcher::CloseImplNoLock() {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(is_closed_);
// This may not need to do anything. Dispatchers should override this to do
// any actual close-time cleanup necessary.
}
MojoResult Dispatcher::WriteMessageImplNoLock(
- UserPointer<const void> /*bytes*/,
+ const void* /*bytes*/,
uint32_t /*num_bytes*/,
std::vector<DispatcherTransport>* /*transports*/,
MojoWriteMessageFlags /*flags*/) {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(!is_closed_);
// By default, not supported. Only needed for message pipe dispatchers.
return MOJO_RESULT_INVALID_ARGUMENT;
}
MojoResult Dispatcher::ReadMessageImplNoLock(
- UserPointer<void> /*bytes*/,
- UserPointer<uint32_t> /*num_bytes*/,
+ void* /*bytes*/,
+ uint32_t* /*num_bytes*/,
DispatcherVector* /*dispatchers*/,
uint32_t* /*num_dispatchers*/,
MojoReadMessageFlags /*flags*/) {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(!is_closed_);
// By default, not supported. Only needed for message pipe dispatchers.
return MOJO_RESULT_INVALID_ARGUMENT;
}
-MojoResult Dispatcher::WriteDataImplNoLock(UserPointer<const void> /*elements*/,
- UserPointer<uint32_t> /*num_bytes*/,
+MojoResult Dispatcher::WriteDataImplNoLock(const void* /*elements*/,
+ uint32_t* /*num_bytes*/,
MojoWriteDataFlags /*flags*/) {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(!is_closed_);
// By default, not supported. Only needed for data pipe dispatchers.
return MOJO_RESULT_INVALID_ARGUMENT;
}
MojoResult Dispatcher::BeginWriteDataImplNoLock(
- UserPointer<void*> /*buffer*/,
- UserPointer<uint32_t> /*buffer_num_bytes*/,
+ void** /*buffer*/,
+ uint32_t* /*buffer_num_bytes*/,
MojoWriteDataFlags /*flags*/) {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(!is_closed_);
// By default, not supported. Only needed for data pipe dispatchers.
return MOJO_RESULT_INVALID_ARGUMENT;
}
MojoResult Dispatcher::EndWriteDataImplNoLock(uint32_t /*num_bytes_written*/) {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(!is_closed_);
// By default, not supported. Only needed for data pipe dispatchers.
return MOJO_RESULT_INVALID_ARGUMENT;
}
-MojoResult Dispatcher::ReadDataImplNoLock(UserPointer<void> /*elements*/,
- UserPointer<uint32_t> /*num_bytes*/,
+MojoResult Dispatcher::ReadDataImplNoLock(void* /*elements*/,
+ uint32_t* /*num_bytes*/,
MojoReadDataFlags /*flags*/) {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(!is_closed_);
// By default, not supported. Only needed for data pipe dispatchers.
return MOJO_RESULT_INVALID_ARGUMENT;
}
MojoResult Dispatcher::BeginReadDataImplNoLock(
- UserPointer<const void*> /*buffer*/,
- UserPointer<uint32_t> /*buffer_num_bytes*/,
+ const void** /*buffer*/,
+ uint32_t* /*buffer_num_bytes*/,
MojoReadDataFlags /*flags*/) {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(!is_closed_);
// By default, not supported. Only needed for data pipe dispatchers.
return MOJO_RESULT_INVALID_ARGUMENT;
}
MojoResult Dispatcher::EndReadDataImplNoLock(uint32_t /*num_bytes_read*/) {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(!is_closed_);
// By default, not supported. Only needed for data pipe dispatchers.
return MOJO_RESULT_INVALID_ARGUMENT;
}
MojoResult Dispatcher::DuplicateBufferHandleImplNoLock(
- UserPointer<const MojoDuplicateBufferHandleOptions> /*options*/,
+ const MojoDuplicateBufferHandleOptions* /*options*/,
scoped_refptr<Dispatcher>* /*new_dispatcher*/) {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(!is_closed_);
// By default, not supported. Only needed for buffer dispatchers.
return MOJO_RESULT_INVALID_ARGUMENT;
@@ -360,15 +363,15 @@ MojoResult Dispatcher::MapBufferImplNoLock(
uint64_t /*offset*/,
uint64_t /*num_bytes*/,
MojoMapBufferFlags /*flags*/,
- scoped_ptr<embedder::PlatformSharedBufferMapping>* /*mapping*/) {
- mutex_.AssertHeld();
+ scoped_ptr<PlatformSharedBufferMapping>* /*mapping*/) {
+ lock_.AssertAcquired();
DCHECK(!is_closed_);
// By default, not supported. Only needed for buffer dispatchers.
return MOJO_RESULT_INVALID_ARGUMENT;
}
HandleSignalsState Dispatcher::GetHandleSignalsStateImplNoLock() const {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(!is_closed_);
// By default, waiting isn't supported. Only dispatchers that can be waited on
// will do something nontrivial.
@@ -380,7 +383,7 @@ MojoResult Dispatcher::AddAwakableImplNoLock(
MojoHandleSignals /*signals*/,
uint32_t /*context*/,
HandleSignalsState* signals_state) {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(!is_closed_);
// By default, waiting isn't supported. Only dispatchers that can be waited on
// will do something nontrivial.
@@ -391,7 +394,7 @@ MojoResult Dispatcher::AddAwakableImplNoLock(
void Dispatcher::RemoveAwakableImplNoLock(Awakable* /*awakable*/,
HandleSignalsState* signals_state) {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(!is_closed_);
// By default, waiting isn't supported. Only dispatchers that can be waited on
// will do something nontrivial.
@@ -399,8 +402,7 @@ void Dispatcher::RemoveAwakableImplNoLock(Awakable* /*awakable*/,
*signals_state = HandleSignalsState();
}
-void Dispatcher::StartSerializeImplNoLock(Channel* /*channel*/,
- size_t* max_size,
+void Dispatcher::StartSerializeImplNoLock(size_t* max_size,
size_t* max_platform_handles) {
DCHECK(HasOneRef()); // Only one ref => no need to take the lock.
DCHECK(!is_closed_);
@@ -409,10 +411,9 @@ void Dispatcher::StartSerializeImplNoLock(Channel* /*channel*/,
}
bool Dispatcher::EndSerializeAndCloseImplNoLock(
- Channel* /*channel*/,
void* /*destination*/,
size_t* /*actual_size*/,
- embedder::PlatformHandleVector* /*platform_handles*/) {
+ PlatformHandleVector* /*platform_handles*/) {
DCHECK(HasOneRef()); // Only one ref => no need to take the lock.
DCHECK(is_closed_);
// By default, serializing isn't supported, so just close.
@@ -421,7 +422,7 @@ bool Dispatcher::EndSerializeAndCloseImplNoLock(
}
bool Dispatcher::IsBusyNoLock() const {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(!is_closed_);
// Most dispatchers support only "atomic" operations, so they are never busy
// (in this sense).
@@ -429,7 +430,7 @@ bool Dispatcher::IsBusyNoLock() const {
}
void Dispatcher::CloseNoLock() {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(!is_closed_);
is_closed_ = true;
@@ -439,7 +440,7 @@ void Dispatcher::CloseNoLock() {
scoped_refptr<Dispatcher>
Dispatcher::CreateEquivalentDispatcherAndCloseNoLock() {
- mutex_.AssertHeld();
+ lock_.AssertAcquired();
DCHECK(!is_closed_);
is_closed_ = true;
@@ -447,25 +448,18 @@ Dispatcher::CreateEquivalentDispatcherAndCloseNoLock() {
return CreateEquivalentDispatcherAndCloseImplNoLock();
}
-void Dispatcher::StartSerialize(Channel* channel,
- size_t* max_size,
+void Dispatcher::StartSerialize(size_t* max_size,
size_t* max_platform_handles) {
- DCHECK(channel);
DCHECK(max_size);
DCHECK(max_platform_handles);
- DCHECK(HasOneRef()); // Only one ref => no need to take the lock.
DCHECK(!is_closed_);
- StartSerializeImplNoLock(channel, max_size, max_platform_handles);
+ StartSerializeImplNoLock(max_size, max_platform_handles);
}
-bool Dispatcher::EndSerializeAndClose(
- Channel* channel,
- void* destination,
- size_t* actual_size,
- embedder::PlatformHandleVector* platform_handles) {
- DCHECK(channel);
+bool Dispatcher::EndSerializeAndClose(void* destination,
+ size_t* actual_size,
+ PlatformHandleVector* platform_handles) {
DCHECK(actual_size);
- DCHECK(HasOneRef()); // Only one ref => no need to take the lock.
DCHECK(!is_closed_);
// Like other |...Close()| methods, we mark ourselves as closed before calling
@@ -477,10 +471,10 @@ bool Dispatcher::EndSerializeAndClose(
// See the comment above |EndSerializeAndCloseImplNoLock()|. In brief: Locking
// isn't actually needed, but we need to satisfy assertions (which we don't
// want to remove or weaken).
- MutexLocker locker(&mutex_);
+ base::AutoLock locker(lock_);
#endif
- return EndSerializeAndCloseImplNoLock(channel, destination, actual_size,
+ return EndSerializeAndCloseImplNoLock(destination, actual_size,
platform_handles);
}
@@ -488,9 +482,12 @@ bool Dispatcher::EndSerializeAndClose(
void DispatcherTransport::End() {
DCHECK(dispatcher_);
- dispatcher_->mutex_.Unlock();
+ dispatcher_->lock_.Release();
+
+ dispatcher_->TransportEnded();
+
dispatcher_ = nullptr;
}
-} // namespace system
+} // namespace edk
} // namespace mojo

Powered by Google App Engine
This is Rietveld 408576698