OLD | NEW |
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/public/cpp/bindings/lib/multiplex_router.h" | 5 #include "mojo/public/cpp/bindings/lib/multiplex_router.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
587 return; | 587 return; |
588 | 588 |
589 while (!tasks_.empty()) { | 589 while (!tasks_.empty()) { |
590 std::unique_ptr<Task> task(std::move(tasks_.front())); | 590 std::unique_ptr<Task> task(std::move(tasks_.front())); |
591 tasks_.pop_front(); | 591 tasks_.pop_front(); |
592 | 592 |
593 InterfaceId id = kInvalidInterfaceId; | 593 InterfaceId id = kInvalidInterfaceId; |
594 bool sync_message = task->IsMessageTask() && task->message && | 594 bool sync_message = task->IsMessageTask() && task->message && |
595 task->message->has_flag(kMessageIsSync); | 595 task->message->has_flag(kMessageIsSync); |
596 if (sync_message) { | 596 if (sync_message) { |
597 InterfaceId id = task->message->interface_id(); | 597 id = task->message->interface_id(); |
598 auto& sync_message_queue = sync_message_tasks_[id]; | 598 auto& sync_message_queue = sync_message_tasks_[id]; |
599 DCHECK_EQ(task.get(), sync_message_queue.front()); | 599 DCHECK_EQ(task.get(), sync_message_queue.front()); |
600 sync_message_queue.pop_front(); | 600 sync_message_queue.pop_front(); |
601 } | 601 } |
602 | 602 |
603 bool processed = | 603 bool processed = |
604 task->IsNotifyErrorTask() | 604 task->IsNotifyErrorTask() |
605 ? ProcessNotifyErrorTask(task.get(), client_call_behavior, | 605 ? ProcessNotifyErrorTask(task.get(), client_call_behavior, |
606 current_task_runner) | 606 current_task_runner) |
607 : ProcessIncomingMessage(task->message.get(), client_call_behavior, | 607 : ProcessIncomingMessage(task->message.get(), client_call_behavior, |
608 current_task_runner); | 608 current_task_runner); |
609 | 609 |
610 if (!processed) { | 610 if (!processed) { |
611 tasks_.push_front(std::move(task)); | |
612 if (sync_message) { | 611 if (sync_message) { |
613 auto& sync_message_queue = sync_message_tasks_[id]; | 612 auto& sync_message_queue = sync_message_tasks_[id]; |
614 sync_message_queue.push_front(task.get()); | 613 sync_message_queue.push_front(task.get()); |
615 } | 614 } |
| 615 tasks_.push_front(std::move(task)); |
616 break; | 616 break; |
617 } else { | 617 } else { |
618 if (sync_message) { | 618 if (sync_message) { |
619 auto iter = sync_message_tasks_.find(id); | 619 auto iter = sync_message_tasks_.find(id); |
620 if (iter != sync_message_tasks_.end() && iter->second.empty()) | 620 if (iter != sync_message_tasks_.end() && iter->second.empty()) |
621 sync_message_tasks_.erase(iter); | 621 sync_message_tasks_.erase(iter); |
622 } | 622 } |
623 } | 623 } |
624 } | 624 } |
625 } | 625 } |
(...skipping 10 matching lines...) Expand all Loading... |
636 | 636 |
637 DCHECK(task->IsMessageTask()); | 637 DCHECK(task->IsMessageTask()); |
638 std::unique_ptr<Message> message(std::move(task->message)); | 638 std::unique_ptr<Message> message(std::move(task->message)); |
639 | 639 |
640 // Note: after this call, |task| and |iter| may be invalidated. | 640 // Note: after this call, |task| and |iter| may be invalidated. |
641 bool processed = ProcessIncomingMessage( | 641 bool processed = ProcessIncomingMessage( |
642 message.get(), ALLOW_DIRECT_CLIENT_CALLS_FOR_SYNC_MESSAGES, nullptr); | 642 message.get(), ALLOW_DIRECT_CLIENT_CALLS_FOR_SYNC_MESSAGES, nullptr); |
643 DCHECK(processed); | 643 DCHECK(processed); |
644 | 644 |
645 iter = sync_message_tasks_.find(id); | 645 iter = sync_message_tasks_.find(id); |
646 return iter != sync_message_tasks_.end() && !iter->second.empty(); | 646 if (iter == sync_message_tasks_.end()) |
| 647 return false; |
| 648 |
| 649 if (iter->second.empty()) { |
| 650 sync_message_tasks_.erase(iter); |
| 651 return false; |
| 652 } |
| 653 |
| 654 return true; |
647 } | 655 } |
648 | 656 |
649 bool MultiplexRouter::ProcessNotifyErrorTask( | 657 bool MultiplexRouter::ProcessNotifyErrorTask( |
650 Task* task, | 658 Task* task, |
651 ClientCallBehavior client_call_behavior, | 659 ClientCallBehavior client_call_behavior, |
652 base::SingleThreadTaskRunner* current_task_runner) { | 660 base::SingleThreadTaskRunner* current_task_runner) { |
653 DCHECK(!current_task_runner || current_task_runner->BelongsToCurrentThread()); | 661 DCHECK(!current_task_runner || current_task_runner->BelongsToCurrentThread()); |
654 lock_.AssertAcquired(); | 662 lock_.AssertAcquired(); |
655 InterfaceEndpoint* endpoint = task->endpoint_to_notify.get(); | 663 InterfaceEndpoint* endpoint = task->endpoint_to_notify.get(); |
656 if (!endpoint->client()) | 664 if (!endpoint->client()) |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
821 *inserted = true; | 829 *inserted = true; |
822 } else { | 830 } else { |
823 endpoint = iter->second.get(); | 831 endpoint = iter->second.get(); |
824 } | 832 } |
825 | 833 |
826 return endpoint; | 834 return endpoint; |
827 } | 835 } |
828 | 836 |
829 } // namespace internal | 837 } // namespace internal |
830 } // namespace mojo | 838 } // namespace mojo |
OLD | NEW |