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

Unified Diff: mojo/system/channel.cc

Issue 472603002: Mojo: Add the ability to notify a Mojo Channel that it's going to be destroyed soon. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: comment fix Created 6 years, 4 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
« no previous file with comments | « mojo/system/channel.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/system/channel.cc
diff --git a/mojo/system/channel.cc b/mojo/system/channel.cc
index 2d78242f40827ab47b09317318261c22b377a0fb..fd5364eaba4a483e6d383d0288332dad05cb98e9 100644
--- a/mojo/system/channel.cc
+++ b/mojo/system/channel.cc
@@ -36,7 +36,10 @@ Channel::EndpointInfo::EndpointInfo(scoped_refptr<MessagePipe> message_pipe,
Channel::EndpointInfo::~EndpointInfo() {
}
-Channel::Channel() : is_running_(false), next_local_id_(kBootstrapEndpointId) {
+Channel::Channel()
+ : is_running_(false),
+ is_shutting_down_(false),
+ next_local_id_(kBootstrapEndpointId) {
}
bool Channel::Init(scoped_ptr<RawChannel> raw_channel) {
@@ -45,7 +48,7 @@ bool Channel::Init(scoped_ptr<RawChannel> raw_channel) {
// No need to take |lock_|, since this must be called before this object
// becomes thread-safe.
- DCHECK(!is_running_no_lock());
+ DCHECK(!is_running_);
raw_channel_ = raw_channel.Pass();
if (!raw_channel_->Init(this)) {
@@ -63,7 +66,7 @@ void Channel::Shutdown() {
IdToEndpointInfoMap to_destroy;
{
base::AutoLock locker(lock_);
- if (!is_running_no_lock())
+ if (!is_running_)
return;
// Note: Don't reset |raw_channel_|, in case we're being called from within
@@ -93,6 +96,11 @@ void Channel::Shutdown() {
<< " zombies";
}
+void Channel::WillShutdownSoon() {
+ base::AutoLock locker(lock_);
+ is_shutting_down_ = true;
+}
+
MessageInTransit::EndpointId Channel::AttachMessagePipeEndpoint(
scoped_refptr<MessagePipe> message_pipe,
unsigned port) {
@@ -103,6 +111,9 @@ MessageInTransit::EndpointId Channel::AttachMessagePipeEndpoint(
{
base::AutoLock locker(lock_);
+ DLOG_IF(WARNING, is_shutting_down_)
+ << "AttachMessagePipeEndpoint() while shutting down";
+
while (next_local_id_ == MessageInTransit::kInvalidEndpointId ||
local_id_to_endpoint_info_map_.find(next_local_id_) !=
local_id_to_endpoint_info_map_.end())
@@ -151,6 +162,9 @@ bool Channel::RunMessagePipeEndpoint(MessageInTransit::EndpointId local_id,
{
base::AutoLock locker(lock_);
+ DLOG_IF(WARNING, is_shutting_down_)
+ << "RunMessagePipeEndpoint() while shutting down";
+
IdToEndpointInfoMap::const_iterator it =
local_id_to_endpoint_info_map_.find(local_id);
if (it == local_id_to_endpoint_info_map_.end())
@@ -197,19 +211,20 @@ void Channel::RunRemoteMessagePipeEndpoint(
bool Channel::WriteMessage(scoped_ptr<MessageInTransit> message) {
base::AutoLock locker(lock_);
- if (!is_running_no_lock()) {
+ if (!is_running_) {
// TODO(vtl): I think this is probably not an error condition, but I should
// think about it (and the shutdown sequence) more carefully.
LOG(WARNING) << "WriteMessage() after shutdown";
return false;
}
+ DLOG_IF(WARNING, is_shutting_down_) << "WriteMessage() while shutting down";
return raw_channel_->WriteMessage(message.Pass());
}
bool Channel::IsWriteBufferEmpty() {
base::AutoLock locker(lock_);
- if (!is_running_no_lock())
+ if (!is_running_)
return true;
return raw_channel_->IsWriteBufferEmpty();
}
@@ -222,7 +237,7 @@ void Channel::DetachMessagePipeEndpoint(
bool should_send_remove_message = false;
{
base::AutoLock locker_(lock_);
- if (!is_running_no_lock())
+ if (!is_running_)
return;
IdToEndpointInfoMap::iterator it =
@@ -268,7 +283,7 @@ size_t Channel::GetSerializedPlatformHandleSize() const {
Channel::~Channel() {
// The channel should have been shut down first.
- DCHECK(!is_running_no_lock());
+ DCHECK(!is_running_);
}
void Channel::OnReadMessage(
@@ -296,9 +311,12 @@ void Channel::OnError(Error error) {
// The other side was cleanly closed, so this isn't actually an error.
DVLOG(1) << "RawChannel read error (shutdown)";
break;
- case ERROR_READ_BROKEN:
- LOG(ERROR) << "RawChannel read error (connection broken)";
+ case ERROR_READ_BROKEN: {
+ base::AutoLock locker(lock_);
+ LOG_IF(ERROR, !is_shutting_down_)
+ << "RawChannel read error (connection broken)";
break;
+ }
case ERROR_READ_BAD_MESSAGE:
// Receiving a bad message means either a bug, data corruption, or
// malicious attack (probably due to some other bug).
@@ -335,7 +353,7 @@ void Channel::OnReadMessageForDownstream(
// Since we own |raw_channel_|, and this method and |Shutdown()| should only
// be called from the creation thread, |raw_channel_| should never be null
// here.
- DCHECK(is_running_no_lock());
+ DCHECK(is_running_);
IdToEndpointInfoMap::const_iterator it =
local_id_to_endpoint_info_map_.find(local_id);
« no previous file with comments | « mojo/system/channel.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698