summaryrefslogtreecommitdiffstats
path: root/mojo/system/message_in_transit.cc
diff options
context:
space:
mode:
Diffstat (limited to 'mojo/system/message_in_transit.cc')
-rw-r--r--mojo/system/message_in_transit.cc25
1 files changed, 25 insertions, 0 deletions
diff --git a/mojo/system/message_in_transit.cc b/mojo/system/message_in_transit.cc
index 80ebf08..3b7f315 100644
--- a/mojo/system/message_in_transit.cc
+++ b/mojo/system/message_in_transit.cc
@@ -78,6 +78,7 @@ MessageInTransit::MessageInTransit(OwnedBuffer,
: owns_main_buffer_(true),
main_buffer_size_(other.main_buffer_size()),
main_buffer_(base::AlignedAlloc(main_buffer_size_, kMessageAlignment)) {
+ DCHECK(!other.dispatchers_.get());
DCHECK_GE(main_buffer_size_, sizeof(Header));
DCHECK_EQ(main_buffer_size_ % kMessageAlignment, 0u);
@@ -111,6 +112,17 @@ MessageInTransit::~MessageInTransit() {
main_buffer_ = NULL;
#endif
}
+
+ if (dispatchers_.get()) {
+ for (size_t i = 0; i < dispatchers_->size(); i++) {
+ if (!(*dispatchers_)[i])
+ continue;
+
+ DCHECK((*dispatchers_)[i]->HasOneRef());
+ (*dispatchers_)[i]->Close();
+ }
+ dispatchers_.reset();
+ }
}
// static
@@ -131,5 +143,18 @@ bool MessageInTransit::GetNextMessageSize(const void* buffer,
return true;
}
+void MessageInTransit::SetDispatchers(
+ scoped_ptr<std::vector<scoped_refptr<Dispatcher> > > dispatchers) {
+ DCHECK(dispatchers.get());
+ DCHECK(owns_main_buffer_);
+ DCHECK(!dispatchers_.get());
+
+ dispatchers_ = dispatchers.Pass();
+#ifndef NDEBUG
+ for (size_t i = 0; i < dispatchers_->size(); i++)
+ DCHECK(!(*dispatchers_)[i] || (*dispatchers_)[i]->HasOneRef());
+#endif
+}
+
} // namespace system
} // namespace mojo