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

Side by Side Diff: mojo/edk/system/message_pipe_dispatcher.cc

Issue 1475113004: Fix shutdown assert in new Mojo EDK. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years 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 unified diff | Download patch
« no previous file with comments | « mojo/edk/system/data_pipe_producer_dispatcher.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "mojo/edk/system/message_pipe_dispatcher.h" 5 #include "mojo/edk/system/message_pipe_dispatcher.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "mojo/edk/embedder/embedder_internal.h" 10 #include "mojo/edk/embedder/embedder_internal.h"
11 #include "mojo/edk/embedder/platform_handle_utils.h" 11 #include "mojo/edk/embedder/platform_handle_utils.h"
12 #include "mojo/edk/embedder/platform_shared_buffer.h" 12 #include "mojo/edk/embedder/platform_shared_buffer.h"
13 #include "mojo/edk/embedder/platform_support.h" 13 #include "mojo/edk/embedder/platform_support.h"
14 #include "mojo/edk/system/configuration.h" 14 #include "mojo/edk/system/configuration.h"
15 #include "mojo/edk/system/message_in_transit.h" 15 #include "mojo/edk/system/message_in_transit.h"
16 #include "mojo/edk/system/options_validation.h" 16 #include "mojo/edk/system/options_validation.h"
17 #include "mojo/edk/system/transport_data.h" 17 #include "mojo/edk/system/transport_data.h"
18 18
19 #if defined(OS_WIN) 19 #if defined(OS_WIN)
20 #include "mojo/edk/system/token_serializer_win.h" 20 #include "mojo/edk/system/token_serializer_win.h"
21 #endif 21 #endif
22 22
23 namespace mojo { 23 namespace mojo {
24 namespace edk { 24 namespace edk {
25 25
26 // TODO(jam): do more tests on using channel on same thread if it supports it (
27 // i.e. with USE_CHROME_EDK and Windows). Also see ipc_channel_mojo.cc
28 bool g_use_channel_on_io_thread_only = true;
29
30 namespace { 26 namespace {
31 27
32 const size_t kInvalidMessagePipeHandleIndex = static_cast<size_t>(-1); 28 const size_t kInvalidMessagePipeHandleIndex = static_cast<size_t>(-1);
33 29
34 struct MOJO_ALIGNAS(8) SerializedMessagePipeHandleDispatcher { 30 struct MOJO_ALIGNAS(8) SerializedMessagePipeHandleDispatcher {
35 // Could be |kInvalidMessagePipeHandleIndex| if the other endpoint of the MP 31 // Could be |kInvalidMessagePipeHandleIndex| if the other endpoint of the MP
36 // was closed. 32 // was closed.
37 size_t platform_handle_index; 33 size_t platform_handle_index;
38 bool write_error; 34 bool write_error;
39 35
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 std::vector<int>* serialized_read_fds, 123 std::vector<int>* serialized_read_fds,
128 std::vector<int>* serialized_write_fds) { 124 std::vector<int>* serialized_write_fds) {
129 if (message_pipe.get().is_valid()) { 125 if (message_pipe.get().is_valid()) {
130 channel_ = RawChannel::Create(message_pipe.Pass()); 126 channel_ = RawChannel::Create(message_pipe.Pass());
131 127
132 // TODO(jam): It's probably cleaner to pass this in Init call. 128 // TODO(jam): It's probably cleaner to pass this in Init call.
133 channel_->SetSerializedData( 129 channel_->SetSerializedData(
134 serialized_read_buffer, serialized_read_buffer_size, 130 serialized_read_buffer, serialized_read_buffer_size,
135 serialized_write_buffer, serialized_write_buffer_size, 131 serialized_write_buffer, serialized_write_buffer_size,
136 serialized_read_fds, serialized_write_fds); 132 serialized_read_fds, serialized_write_fds);
137 if (g_use_channel_on_io_thread_only) { 133 internal::g_io_thread_task_runner->PostTask(
138 internal::g_io_thread_task_runner->PostTask( 134 FROM_HERE, base::Bind(&MessagePipeDispatcher::InitOnIO, this));
139 FROM_HERE, base::Bind(&MessagePipeDispatcher::InitOnIO, this));
140 } else {
141 InitOnIO();
142 }
143 // TODO(jam): optimize for when running on IO thread?
144 } 135 }
145 } 136 }
146 137
147 void MessagePipeDispatcher::InitOnIO() { 138 void MessagePipeDispatcher::InitOnIO() {
148 base::AutoLock locker(lock()); 139 base::AutoLock locker(lock());
149 calling_init_ = true; 140 calling_init_ = true;
150 if (channel_) 141 if (channel_)
151 channel_->Init(this); 142 channel_->Init(this);
152 calling_init_ = false; 143 calling_init_ = false;
153 } 144 }
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 : channel_(nullptr), 341 : channel_(nullptr),
351 serialized_(false), 342 serialized_(false),
352 serialized_read_fds_length_(0u), 343 serialized_read_fds_length_(0u),
353 serialized_write_fds_length_(0u), 344 serialized_write_fds_length_(0u),
354 serialized_message_fds_length_(0u), 345 serialized_message_fds_length_(0u),
355 calling_init_(false), 346 calling_init_(false),
356 write_error_(false) { 347 write_error_(false) {
357 } 348 }
358 349
359 MessagePipeDispatcher::~MessagePipeDispatcher() { 350 MessagePipeDispatcher::~MessagePipeDispatcher() {
360 // |Close()|/|CloseImplNoLock()| should have taken care of the channel. 351 // |Close()|/|CloseImplNoLock()| should have taken care of the channel. The
361 DCHECK(!channel_); 352 // exception is if they posted a task to run CloseOnIO but the IO thread shut
353 // down and so when it was deleting pending tasks it caused the last reference
354 // to destruct this object. In that case, safe to destroy the channel.
355 if (channel_ && internal::g_io_thread_task_runner->RunsTasksOnCurrentThread())
356 channel_->Shutdown();
357 else
358 DCHECK(!channel_);
362 #if defined(OS_POSIX) 359 #if defined(OS_POSIX)
363 ClosePlatformHandles(&serialized_fds_); 360 ClosePlatformHandles(&serialized_fds_);
364 #endif 361 #endif
365 } 362 }
366 363
367 void MessagePipeDispatcher::CancelAllAwakablesNoLock() { 364 void MessagePipeDispatcher::CancelAllAwakablesNoLock() {
368 lock().AssertAcquired(); 365 lock().AssertAcquired();
369 awakable_list_.CancelAll(); 366 awakable_list_.CancelAll();
370 } 367 }
371 368
372 void MessagePipeDispatcher::CloseImplNoLock() { 369 void MessagePipeDispatcher::CloseImplNoLock() {
373 lock().AssertAcquired(); 370 lock().AssertAcquired();
374 if (g_use_channel_on_io_thread_only) { 371 internal::g_io_thread_task_runner->PostTask(
375 internal::g_io_thread_task_runner->PostTask( 372 FROM_HERE, base::Bind(&MessagePipeDispatcher::CloseOnIO, this));
376 FROM_HERE, base::Bind(&MessagePipeDispatcher::CloseOnIO, this));
377 } else {
378 CloseOnIO();
379 }
380 } 373 }
381 374
382 void MessagePipeDispatcher::SerializeInternal() { 375 void MessagePipeDispatcher::SerializeInternal() {
383 // We need to stop watching handle immediately, even though not on IO thread, 376 // We need to stop watching handle immediately, even though not on IO thread,
384 // so that other messages aren't read after this. 377 // so that other messages aren't read after this.
385 std::vector<int> serialized_read_fds, serialized_write_fds; 378 std::vector<int> serialized_read_fds, serialized_write_fds;
386 if (channel_) { 379 if (channel_) {
387 bool write_error = false; 380 bool write_error = false;
388 381
389 serialized_platform_handle_ = channel_->ReleaseHandle( 382 serialized_platform_handle_ = channel_->ReleaseHandle(
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
855 LOG(WARNING) << "Enqueueing null dispatcher"; 848 LOG(WARNING) << "Enqueueing null dispatcher";
856 dispatchers->push_back(nullptr); 849 dispatchers->push_back(nullptr);
857 } 850 }
858 } 851 }
859 message->SetDispatchers(dispatchers.Pass()); 852 message->SetDispatchers(dispatchers.Pass());
860 return MOJO_RESULT_OK; 853 return MOJO_RESULT_OK;
861 } 854 }
862 855
863 } // namespace edk 856 } // namespace edk
864 } // namespace mojo 857 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/data_pipe_producer_dispatcher.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698