OLD | NEW |
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 "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 // outermost call completes first, etc. | 499 // outermost call completes first, etc. |
500 if (old_send_done_event_watcher) { | 500 if (old_send_done_event_watcher) { |
501 old_delegate = old_send_done_event_watcher->delegate(); | 501 old_delegate = old_send_done_event_watcher->delegate(); |
502 old_event = old_send_done_event_watcher->GetWatchedEvent(); | 502 old_event = old_send_done_event_watcher->GetWatchedEvent(); |
503 old_send_done_event_watcher->StopWatching(); | 503 old_send_done_event_watcher->StopWatching(); |
504 } | 504 } |
505 | 505 |
506 sync_msg_queue->set_top_send_done_watcher(&send_done_watcher); | 506 sync_msg_queue->set_top_send_done_watcher(&send_done_watcher); |
507 | 507 |
508 send_done_watcher.StartWatching(context->GetSendDoneEvent(), context); | 508 send_done_watcher.StartWatching(context->GetSendDoneEvent(), context); |
509 bool old_state = MessageLoop::current()->NestableTasksAllowed(); | |
510 | 509 |
511 MessageLoop::current()->SetNestableTasksAllowed(true); | 510 { |
512 MessageLoop::current()->Run(); | 511 MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
513 MessageLoop::current()->SetNestableTasksAllowed(old_state); | 512 MessageLoop::current()->Run(); |
| 513 } |
514 | 514 |
515 sync_msg_queue->set_top_send_done_watcher(old_send_done_event_watcher); | 515 sync_msg_queue->set_top_send_done_watcher(old_send_done_event_watcher); |
516 if (old_send_done_event_watcher && old_event) { | 516 if (old_send_done_event_watcher && old_event) { |
517 old_send_done_event_watcher->StartWatching(old_event, old_delegate); | 517 old_send_done_event_watcher->StartWatching(old_event, old_delegate); |
518 } | 518 } |
519 } | 519 } |
520 | 520 |
521 void SyncChannel::OnWaitableEventSignaled(WaitableEvent* event) { | 521 void SyncChannel::OnWaitableEventSignaled(WaitableEvent* event) { |
522 DCHECK(event == sync_context()->GetDispatchEvent()); | 522 DCHECK(event == sync_context()->GetDispatchEvent()); |
523 // The call to DispatchMessages might delete this object, so reregister | 523 // The call to DispatchMessages might delete this object, so reregister |
524 // the object watcher first. | 524 // the object watcher first. |
525 event->Reset(); | 525 event->Reset(); |
526 dispatch_watcher_.StartWatching(event, this); | 526 dispatch_watcher_.StartWatching(event, this); |
527 sync_context()->DispatchMessages(); | 527 sync_context()->DispatchMessages(); |
528 } | 528 } |
529 | 529 |
530 void SyncChannel::StartWatching() { | 530 void SyncChannel::StartWatching() { |
531 // Ideally we only want to watch this object when running a nested message | 531 // Ideally we only want to watch this object when running a nested message |
532 // loop. However, we don't know when it exits if there's another nested | 532 // loop. However, we don't know when it exits if there's another nested |
533 // message loop running under it or not, so we wouldn't know whether to | 533 // message loop running under it or not, so we wouldn't know whether to |
534 // stop or keep watching. So we always watch it, and create the event as | 534 // stop or keep watching. So we always watch it, and create the event as |
535 // manual reset since the object watcher might otherwise reset the event | 535 // manual reset since the object watcher might otherwise reset the event |
536 // when we're doing a WaitMany. | 536 // when we're doing a WaitMany. |
537 dispatch_watcher_.StartWatching(sync_context()->GetDispatchEvent(), this); | 537 dispatch_watcher_.StartWatching(sync_context()->GetDispatchEvent(), this); |
538 } | 538 } |
539 | 539 |
540 } // namespace IPC | 540 } // namespace IPC |
OLD | NEW |