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

Unified Diff: third_party/mojo/src/mojo/edk/system/channel_endpoint.cc

Issue 1676913002: [mojo] Delete third_party/mojo (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: let's try that again Created 4 years, 10 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: third_party/mojo/src/mojo/edk/system/channel_endpoint.cc
diff --git a/third_party/mojo/src/mojo/edk/system/channel_endpoint.cc b/third_party/mojo/src/mojo/edk/system/channel_endpoint.cc
deleted file mode 100644
index 78504216ec8bef134178ae0667bd5931546bc3de..0000000000000000000000000000000000000000
--- a/third_party/mojo/src/mojo/edk/system/channel_endpoint.cc
+++ /dev/null
@@ -1,226 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// 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/channel_endpoint.h"
-
-#include <utility>
-
-#include "base/logging.h"
-#include "base/threading/platform_thread.h"
-#include "mojo/public/cpp/system/macros.h"
-#include "third_party/mojo/src/mojo/edk/system/channel.h"
-#include "third_party/mojo/src/mojo/edk/system/channel_endpoint_client.h"
-
-namespace mojo {
-namespace system {
-
-ChannelEndpoint::ChannelEndpoint(ChannelEndpointClient* client,
- unsigned client_port,
- MessageInTransitQueue* message_queue)
- : state_(State::PAUSED),
- client_(client),
- client_port_(client_port),
- channel_(nullptr) {
- DCHECK(client_ || message_queue);
-
- if (message_queue)
- channel_message_queue_.Swap(message_queue);
-}
-
-bool ChannelEndpoint::EnqueueMessage(scoped_ptr<MessageInTransit> message) {
- DCHECK(message);
-
- MutexLocker locker(&mutex_);
-
- switch (state_) {
- case State::PAUSED:
- channel_message_queue_.AddMessage(std::move(message));
- return true;
- case State::RUNNING:
- return WriteMessageNoLock(std::move(message));
- case State::DEAD:
- return false;
- }
-
- NOTREACHED();
- return false;
-}
-
-bool ChannelEndpoint::ReplaceClient(ChannelEndpointClient* client,
- unsigned client_port) {
- DCHECK(client);
-
- MutexLocker locker(&mutex_);
- DCHECK(client_);
- DCHECK(client != client_.get() || client_port != client_port_);
- client_ = client;
- client_port_ = client_port;
- return state_ != State::DEAD;
-}
-
-void ChannelEndpoint::DetachFromClient() {
- MutexLocker locker(&mutex_);
- DCHECK(client_);
- client_ = nullptr;
-
- if (!channel_)
- return;
- channel_->DetachEndpoint(this, local_id_, remote_id_);
- DieNoLock();
-}
-
-void ChannelEndpoint::AttachAndRun(Channel* channel,
- ChannelEndpointId local_id,
- ChannelEndpointId remote_id) {
- DCHECK(channel);
- DCHECK(local_id.is_valid());
- DCHECK(remote_id.is_valid());
-
- MutexLocker locker(&mutex_);
- DCHECK(state_ == State::PAUSED);
- DCHECK(!channel_);
- DCHECK(!local_id_.is_valid());
- DCHECK(!remote_id_.is_valid());
- state_ = State::RUNNING;
- channel_ = channel;
- local_id_ = local_id;
- remote_id_ = remote_id;
-
- while (!channel_message_queue_.IsEmpty()) {
- bool ok = WriteMessageNoLock(channel_message_queue_.GetMessage());
- LOG_IF(WARNING, !ok) << "Failed to write enqueue message to channel";
- }
-
- if (!client_) {
- channel_->DetachEndpoint(this, local_id_, remote_id_);
- DieNoLock();
- }
-}
-
-void ChannelEndpoint::OnReadMessage(scoped_ptr<MessageInTransit> message) {
- if (message->type() == MessageInTransit::Type::ENDPOINT_CLIENT) {
- OnReadMessageForClient(std::move(message));
- return;
- }
-
- DCHECK_EQ(message->type(), MessageInTransit::Type::ENDPOINT);
-
- // TODO(vtl)
- // Note that this won't crash on Release builds, which is important (since the
- // other side may be malicious). Doing nothing is safe and will dispose of the
- // message.
- NOTREACHED();
-}
-
-void ChannelEndpoint::DetachFromChannel() {
- scoped_refptr<ChannelEndpointClient> client;
- unsigned client_port = 0;
- {
- MutexLocker locker(&mutex_);
-
- if (client_) {
- // Take a ref, and call |OnDetachFromChannel()| outside the lock.
- client = client_;
- client_port = client_port_;
- }
-
- // |channel_| may already be null if we already detached from the channel in
- // |DetachFromClient()| by calling |Channel::DetachEndpoint()| (and there
- // are racing detaches).
- if (channel_)
- DieNoLock();
- else
- DCHECK(state_ != State::RUNNING);
- }
-
- // If |ReplaceClient()| is called (from another thread) after the above locked
- // section but before we call |OnDetachFromChannel()|, |ReplaceClient()|
- // returns false to notify the caller that the channel was already detached.
- // (The old client has to accept the arguably-spurious call to
- // |OnDetachFromChannel()|.)
- if (client)
- client->OnDetachFromChannel(client_port);
-}
-
-ChannelEndpoint::~ChannelEndpoint() {
- DCHECK(!client_);
- DCHECK(!channel_);
- DCHECK(!local_id_.is_valid());
- DCHECK(!remote_id_.is_valid());
-}
-
-bool ChannelEndpoint::WriteMessageNoLock(scoped_ptr<MessageInTransit> message) {
- DCHECK(message);
-
- mutex_.AssertHeld();
-
- DCHECK(channel_);
- DCHECK(local_id_.is_valid());
- DCHECK(remote_id_.is_valid());
-
- message->SerializeAndCloseDispatchers(channel_);
- message->set_source_id(local_id_);
- message->set_destination_id(remote_id_);
- return channel_->WriteMessage(std::move(message));
-}
-
-void ChannelEndpoint::OnReadMessageForClient(
- scoped_ptr<MessageInTransit> message) {
- DCHECK_EQ(message->type(), MessageInTransit::Type::ENDPOINT_CLIENT);
-
- scoped_refptr<ChannelEndpointClient> client;
- unsigned client_port = 0;
-
- // This loop is to make |ReplaceClient()| work. We can't call the client's
- // |OnReadMessage()| under our lock, so by the time we do that, |client| may
- // no longer be our client.
- //
- // In that case, |client| must return false. We'll then yield, and retry with
- // the new client. (Theoretically, the client could be replaced again.)
- //
- // This solution isn't terribly elegant, but it's the least costly way of
- // handling/avoiding this (very unlikely) race. (Other solutions -- e.g.,
- // adding a client message queue, which the client only fetches messages from
- // -- impose significant cost in the common case.)
- for (;;) {
- {
- MutexLocker locker(&mutex_);
- if (!channel_ || !client_) {
- // This isn't a failure per se. (It just means that, e.g., the other end
- // of the message pipe closed first.)
- return;
- }
-
- // If we get here in a second (third, etc.) iteration of the loop, it's
- // because |ReplaceClient()| was called.
- DCHECK(client_ != client || client_port_ != client_port);
-
- // Take a ref, and call |OnReadMessage()| outside the lock.
- client = client_;
- client_port = client_port_;
- }
-
- if (client->OnReadMessage(client_port, message.get())) {
- ignore_result(message.release());
- break;
- }
-
- base::PlatformThread::YieldCurrentThread();
- }
-}
-
-void ChannelEndpoint::DieNoLock() {
- DCHECK(state_ == State::RUNNING);
- DCHECK(channel_);
- DCHECK(local_id_.is_valid());
- DCHECK(remote_id_.is_valid());
-
- state_ = State::DEAD;
- channel_ = nullptr;
- local_id_ = ChannelEndpointId();
- remote_id_ = ChannelEndpointId();
-}
-
-} // namespace system
-} // namespace mojo

Powered by Google App Engine
This is Rietveld 408576698