Index: third_party/mojo/src/mojo/edk/system/channel_endpoint.h |
diff --git a/third_party/mojo/src/mojo/edk/system/channel_endpoint.h b/third_party/mojo/src/mojo/edk/system/channel_endpoint.h |
index 807b1a8b3c96605cbabaac60a6ffad1638a5245c..c70e66ed368a0dc663c5527e684d821d47875720 100644 |
--- a/third_party/mojo/src/mojo/edk/system/channel_endpoint.h |
+++ b/third_party/mojo/src/mojo/edk/system/channel_endpoint.h |
@@ -7,9 +7,9 @@ |
#include "base/memory/ref_counted.h" |
#include "base/memory/scoped_ptr.h" |
-#include "base/synchronization/lock.h" |
#include "mojo/edk/system/channel_endpoint_id.h" |
#include "mojo/edk/system/message_in_transit_queue.h" |
+#include "mojo/edk/system/mutex.h" |
#include "mojo/edk/system/system_impl_export.h" |
#include "mojo/public/cpp/system/macros.h" |
@@ -85,7 +85,7 @@ class MessageInTransit; |
// shouldn't receive any more messages for that message pipe endpoint |
// (local ID), but it must wait for the endpoint to detach. (It can't |
// do so without a race, since it can't call into the message pipe |
-// under |lock_|.) [TODO(vtl): When I add remotely-allocated IDs, |
+// under |mutex_|.) [TODO(vtl): When I add remotely-allocated IDs, |
// we'll have to remove the |EndpointInfo| from |
// |local_id_to_endpoint_info_map_| -- i.e., remove the local ID, |
// since it's no longer valid and may be reused by the remote side -- |
@@ -162,19 +162,18 @@ class MOJO_SYSTEM_IMPL_EXPORT ChannelEndpoint final |
friend class base::RefCountedThreadSafe<ChannelEndpoint>; |
~ChannelEndpoint(); |
- // Must be called with |lock_| held. |
- bool WriteMessageNoLock(scoped_ptr<MessageInTransit> message); |
+ bool WriteMessageNoLock(scoped_ptr<MessageInTransit> message) |
+ MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); |
// Helper for |OnReadMessage()|, handling messages for the client. |
void OnReadMessageForClient(scoped_ptr<MessageInTransit> message); |
// Resets |channel_| to null (and sets |channel_state_| to |
// |ChannelState::DETACHED|). This may only be called if |channel_| is |
- // non-null. Must be called with |lock_| held. |
- void ResetChannelNoLock(); |
+ // non-null. |
+ void ResetChannelNoLock() MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); |
- // Protects the members below. |
- base::Lock lock_; |
+ Mutex mutex_; |
// |client_| must be valid whenever it is non-null. Before |*client_| gives up |
// its reference to this object, it must call |DetachFromClient()|. |
@@ -182,14 +181,17 @@ class MOJO_SYSTEM_IMPL_EXPORT ChannelEndpoint final |
// |Channel| needs to keep the |MessagePipe| alive for the "proxy-proxy" case. |
// Possibly we'll be able to eliminate that case when we have full |
// multiprocess support. |
- // WARNING: |ChannelEndpointClient| methods must not be called under |lock_|. |
- // Thus to make such a call, a reference must first be taken under |lock_| and |
- // the lock released. |
+ // WARNING: |ChannelEndpointClient| methods must not be called under |mutex_|. |
+ // Thus to make such a call, a reference must first be taken under |mutex_| |
+ // and the lock released. |
+ // TODO(vtl): Annotate the above rule using |MOJO_ACQUIRED_{BEFORE,AFTER}()|, |
+ // once clang actually checks such annotations. |
+ // https://github.com/domokit/mojo/issues/313 |
// WARNING: Beware of interactions with |ReplaceClient()|. By the time the |
// call is made, the client may have changed. This must be detected and dealt |
// with. |
- scoped_refptr<ChannelEndpointClient> client_; |
- unsigned client_port_; |
+ scoped_refptr<ChannelEndpointClient> client_ MOJO_GUARDED_BY(mutex_); |
+ unsigned client_port_ MOJO_GUARDED_BY(mutex_); |
// State with respect to interaction with the |Channel|. |
enum class ChannelState { |
@@ -201,17 +203,17 @@ class MOJO_SYSTEM_IMPL_EXPORT ChannelEndpoint final |
// |DetachFromChannel()| has been called (|channel_| is null). |
DETACHED |
}; |
- ChannelState channel_state_; |
+ ChannelState channel_state_ MOJO_GUARDED_BY(mutex_); |
// |channel_| must be valid whenever it is non-null. Before |*channel_| gives |
// up its reference to this object, it must call |DetachFromChannel()|. |
// |local_id_| and |remote_id_| are valid if and only |channel_| is non-null. |
- Channel* channel_; |
- ChannelEndpointId local_id_; |
- ChannelEndpointId remote_id_; |
+ Channel* channel_ MOJO_GUARDED_BY(mutex_); |
+ ChannelEndpointId local_id_ MOJO_GUARDED_BY(mutex_); |
+ ChannelEndpointId remote_id_ MOJO_GUARDED_BY(mutex_); |
// This queue is used before we're running on a channel and ready to send |
// messages to the channel. |
- MessageInTransitQueue channel_message_queue_; |
+ MessageInTransitQueue channel_message_queue_ MOJO_GUARDED_BY(mutex_); |
MOJO_DISALLOW_COPY_AND_ASSIGN(ChannelEndpoint); |
}; |