Index: mojo/edk/system/dispatcher.h |
diff --git a/mojo/edk/system/dispatcher.h b/mojo/edk/system/dispatcher.h |
index f22765b8b6881c2b1a223a9c2761ffff82980994..ff8ba8724be05ee5a477d532ce6461f12515fa50 100644 |
--- a/mojo/edk/system/dispatcher.h |
+++ b/mojo/edk/system/dispatcher.h |
@@ -35,15 +35,16 @@ class PlatformSharedBufferMapping; |
namespace system { |
+class Awakable; |
class Channel; |
class Core; |
class Dispatcher; |
class DispatcherTransport; |
class HandleTable; |
class LocalMessagePipeEndpoint; |
+class MessagePipe; |
class ProxyMessagePipeEndpoint; |
class TransportData; |
-class Awakable; |
using DispatcherVector = std::vector<util::RefPtr<Dispatcher>>; |
@@ -259,9 +260,15 @@ class Dispatcher : public util::RefCountedThreadSafe<Dispatcher> { |
virtual void CancelAllAwakablesNoLock() MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); |
virtual void CloseImplNoLock() MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); |
- virtual util::RefPtr<Dispatcher> |
- CreateEquivalentDispatcherAndCloseImplNoLock() |
- MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_) = 0; |
+ // This is called by |CreateEquivalentDispatcherAndCloseNoLock()|. It should |
+ // produce "close" this dispatcher and return a new one equivalent to it. |
azani
2016/05/03 19:54:27
The meaning of "produce 'close' this dispatcher" i
viettrungluu
2016/05/03 20:28:01
Oops, I meant to s/produce // this before landing.
|
+ // Note: Probably the first thing an implementation should do is call |
+ // |CancelAllAwakablesNoLock()| (or equivalent); unlike |CloseNoLock()|, |
+ // |CreateEquivalentDispatcherAndCloseNoLock()| does not do this |
+ // automatically. |
+ virtual util::RefPtr<Dispatcher> CreateEquivalentDispatcherAndCloseImplNoLock( |
+ MessagePipe* message_pipe, |
+ unsigned port) MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_) = 0; |
// These are to be overridden by subclasses (if necessary). They are never |
// called after the dispatcher has been closed. See the descriptions of the |
@@ -379,9 +386,12 @@ class Dispatcher : public util::RefCountedThreadSafe<Dispatcher> { |
// dispatcher -- and close (i.e., disable) this dispatcher. I.e., this |
// dispatcher will look as though it was closed, but the resource it |
// represents will be assigned to the new dispatcher. This must be called |
- // under the dispatcher's lock. |
- util::RefPtr<Dispatcher> CreateEquivalentDispatcherAndCloseNoLock() |
- MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); |
+ // under the dispatcher's lock. If the resulting dispatcher will be put into a |
+ // message on a message pipe, then |message_pipe| will be set appropriately |
+ // (otherwise, it may be null) and |port| will be set to the destination port. |
+ util::RefPtr<Dispatcher> CreateEquivalentDispatcherAndCloseNoLock( |
+ MessagePipe* message_pipe, |
+ unsigned port) MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); |
// API to serialize dispatchers to a |Channel|, exposed to only |
// |TransportData| (via |TransportData|). They may only be called on a |
@@ -440,7 +450,7 @@ class Dispatcher : public util::RefCountedThreadSafe<Dispatcher> { |
// |
// Note: This class is deliberately "thin" -- no more expensive than a |
// |Dispatcher*|. |
-class DispatcherTransport { |
+class DispatcherTransport final { |
public: |
DispatcherTransport() : dispatcher_(nullptr) {} |
@@ -451,16 +461,15 @@ class DispatcherTransport { |
return dispatcher_->IsBusyNoLock(); |
} |
void Close() MOJO_NOT_THREAD_SAFE { dispatcher_->CloseNoLock(); } |
- util::RefPtr<Dispatcher> CreateEquivalentDispatcherAndClose() |
- MOJO_NOT_THREAD_SAFE { |
- return dispatcher_->CreateEquivalentDispatcherAndCloseNoLock(); |
+ util::RefPtr<Dispatcher> CreateEquivalentDispatcherAndClose( |
+ MessagePipe* message_pipe, |
+ unsigned port) MOJO_NOT_THREAD_SAFE { |
+ return dispatcher_->CreateEquivalentDispatcherAndCloseNoLock(message_pipe, |
+ port); |
} |
bool is_valid() const { return !!dispatcher_; } |
- protected: |
- Dispatcher* dispatcher() { return dispatcher_; } |
- |
private: |
friend class Dispatcher::HandleTableAccess; |