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

Side by Side Diff: ipc/ipc_sync_channel.cc

Issue 2725133002: Mojo: Armed Watchers (Closed)
Patch Set: . Created 3 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "ipc/ipc_sync_channel.h" 5 #include "ipc/ipc_sync_channel.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <utility> 10 #include <utility>
(...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after
519 return base::WrapUnique( 519 return base::WrapUnique(
520 new SyncChannel(listener, ipc_task_runner, shutdown_event)); 520 new SyncChannel(listener, ipc_task_runner, shutdown_event));
521 } 521 }
522 522
523 SyncChannel::SyncChannel( 523 SyncChannel::SyncChannel(
524 Listener* listener, 524 Listener* listener,
525 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner, 525 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner,
526 WaitableEvent* shutdown_event) 526 WaitableEvent* shutdown_event)
527 : ChannelProxy(new SyncContext(listener, ipc_task_runner, shutdown_event)), 527 : ChannelProxy(new SyncContext(listener, ipc_task_runner, shutdown_event)),
528 sync_handle_registry_(mojo::SyncHandleRegistry::current()), 528 sync_handle_registry_(mojo::SyncHandleRegistry::current()),
529 dispatch_watcher_(FROM_HERE) { 529 dispatch_watcher_(FROM_HERE, mojo::Watcher::ArmingPolicy::AUTOMATIC) {
530 // The current (listener) thread must be distinct from the IPC thread, or else 530 // The current (listener) thread must be distinct from the IPC thread, or else
531 // sending synchronous messages will deadlock. 531 // sending synchronous messages will deadlock.
532 DCHECK_NE(ipc_task_runner.get(), base::ThreadTaskRunnerHandle::Get().get()); 532 DCHECK_NE(ipc_task_runner.get(), base::ThreadTaskRunnerHandle::Get().get());
533 StartWatching(); 533 StartWatching();
534 } 534 }
535 535
536 SyncChannel::~SyncChannel() { 536 SyncChannel::~SyncChannel() {
537 } 537 }
538 538
539 void SyncChannel::SetRestrictDispatchChannelGroup(int group) { 539 void SyncChannel::SetRestrictDispatchChannelGroup(int group) {
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
635 } 635 }
636 636
637 if (should_pump_messages) 637 if (should_pump_messages)
638 WaitForReplyWithNestedMessageLoop(context); // Run a nested message loop. 638 WaitForReplyWithNestedMessageLoop(context); // Run a nested message loop.
639 639
640 break; 640 break;
641 } 641 }
642 } 642 }
643 643
644 void SyncChannel::WaitForReplyWithNestedMessageLoop(SyncContext* context) { 644 void SyncChannel::WaitForReplyWithNestedMessageLoop(SyncContext* context) {
645 mojo::Watcher send_done_watcher(FROM_HERE); 645 mojo::Watcher send_done_watcher(FROM_HERE,
646 mojo::Watcher::ArmingPolicy::AUTOMATIC);
646 647
647 ReceivedSyncMsgQueue* sync_msg_queue = context->received_sync_msgs(); 648 ReceivedSyncMsgQueue* sync_msg_queue = context->received_sync_msgs();
648 DCHECK_NE(sync_msg_queue, nullptr); 649 DCHECK_NE(sync_msg_queue, nullptr);
649 650
650 mojo::Watcher* old_watcher = sync_msg_queue->top_send_done_watcher(); 651 mojo::Watcher* old_watcher = sync_msg_queue->top_send_done_watcher();
651 mojo::Handle old_handle(mojo::kInvalidHandleValue); 652 mojo::Handle old_handle(mojo::kInvalidHandleValue);
652 mojo::Watcher::ReadyCallback old_callback; 653 mojo::Watcher::ReadyCallback old_callback;
653 654
654 // Maintain a thread-local stack of watchers to ensure nested calls complete 655 // Maintain a thread-local stack of watchers to ensure nested calls complete
655 // in the correct sequence, i.e. the outermost call completes first, etc. 656 // in the correct sequence, i.e. the outermost call completes first, etc.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 MOJO_HANDLE_SIGNAL_READABLE, 694 MOJO_HANDLE_SIGNAL_READABLE,
694 base::Bind(&SyncChannel::OnDispatchHandleReady, 695 base::Bind(&SyncChannel::OnDispatchHandleReady,
695 base::Unretained(this))); 696 base::Unretained(this)));
696 } 697 }
697 698
698 void SyncChannel::OnChannelInit() { 699 void SyncChannel::OnChannelInit() {
699 pre_init_sync_message_filters_.clear(); 700 pre_init_sync_message_filters_.clear();
700 } 701 }
701 702
702 } // namespace IPC 703 } // namespace IPC
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698