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 "content/browser/browser_thread_impl.h" | 5 #include "content/browser/browser_thread_impl.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/atomicops.h" | 10 #include "base/atomicops.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 // with BrowserThread. | 55 // with BrowserThread. |
56 // TODO(gab): Consider replacing this with |g_globals->task_runners| -- only | 56 // TODO(gab): Consider replacing this with |g_globals->task_runners| -- only |
57 // works if none are requested before starting the threads. | 57 // works if none are requested before starting the threads. |
58 class BrowserThreadTaskRunner : public base::SingleThreadTaskRunner { | 58 class BrowserThreadTaskRunner : public base::SingleThreadTaskRunner { |
59 public: | 59 public: |
60 explicit BrowserThreadTaskRunner(BrowserThread::ID identifier) | 60 explicit BrowserThreadTaskRunner(BrowserThread::ID identifier) |
61 : id_(identifier) {} | 61 : id_(identifier) {} |
62 | 62 |
63 // SingleThreadTaskRunner implementation. | 63 // SingleThreadTaskRunner implementation. |
64 bool PostDelayedTask(const tracked_objects::Location& from_here, | 64 bool PostDelayedTask(const tracked_objects::Location& from_here, |
65 base::Closure task, | 65 base::OnceClosure task, |
66 base::TimeDelta delay) override { | 66 base::TimeDelta delay) override { |
67 return BrowserThread::PostDelayedTask(id_, from_here, std::move(task), | 67 return BrowserThread::PostDelayedTask(id_, from_here, std::move(task), |
68 delay); | 68 delay); |
69 } | 69 } |
70 | 70 |
71 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, | 71 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
72 base::Closure task, | 72 base::OnceClosure task, |
73 base::TimeDelta delay) override { | 73 base::TimeDelta delay) override { |
74 return BrowserThread::PostNonNestableDelayedTask(id_, from_here, | 74 return BrowserThread::PostNonNestableDelayedTask(id_, from_here, |
75 std::move(task), delay); | 75 std::move(task), delay); |
76 } | 76 } |
77 | 77 |
78 bool RunsTasksOnCurrentThread() const override { | 78 bool RunsTasksOnCurrentThread() const override { |
79 return BrowserThread::CurrentlyOn(id_); | 79 return BrowserThread::CurrentlyOn(id_); |
80 } | 80 } |
81 | 81 |
82 protected: | 82 protected: |
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 // succeed to post to B. This is pretty much the only observable difference | 483 // succeed to post to B. This is pretty much the only observable difference |
484 // between a redirected thread and a real one and is one we're willing to live | 484 // between a redirected thread and a real one and is one we're willing to live |
485 // with for this experiment. TODO(gab): fix this before enabling the | 485 // with for this experiment. TODO(gab): fix this before enabling the |
486 // experiment by default on trunk, http://crbug.com/653916. | 486 // experiment by default on trunk, http://crbug.com/653916. |
487 } | 487 } |
488 | 488 |
489 // static | 489 // static |
490 bool BrowserThreadImpl::PostTaskHelper( | 490 bool BrowserThreadImpl::PostTaskHelper( |
491 BrowserThread::ID identifier, | 491 BrowserThread::ID identifier, |
492 const tracked_objects::Location& from_here, | 492 const tracked_objects::Location& from_here, |
493 base::Closure task, | 493 base::OnceClosure task, |
494 base::TimeDelta delay, | 494 base::TimeDelta delay, |
495 bool nestable) { | 495 bool nestable) { |
496 DCHECK_GE(identifier, 0); | 496 DCHECK_GE(identifier, 0); |
497 DCHECK_LT(identifier, ID_COUNT); | 497 DCHECK_LT(identifier, ID_COUNT); |
498 // Optimization: to avoid unnecessary locks, we listed the ID enumeration in | 498 // Optimization: to avoid unnecessary locks, we listed the ID enumeration in |
499 // order of lifetime. So no need to lock if we know that the target thread | 499 // order of lifetime. So no need to lock if we know that the target thread |
500 // outlives current thread as that implies the current thread only ever sees | 500 // outlives current thread as that implies the current thread only ever sees |
501 // the target thread in its RUNNING state. | 501 // the target thread in its RUNNING state. |
502 // Note: since the array is so small, ok to loop instead of creating a map, | 502 // Note: since the array is so small, ok to loop instead of creating a map, |
503 // which would require a lock because std::map isn't thread safe, defeating | 503 // which would require a lock because std::map isn't thread safe, defeating |
(...skipping 23 matching lines...) Expand all Loading... |
527 | 527 |
528 if (!target_thread_outlives_current) | 528 if (!target_thread_outlives_current) |
529 globals.lock.Release(); | 529 globals.lock.Release(); |
530 | 530 |
531 return accepting_tasks; | 531 return accepting_tasks; |
532 } | 532 } |
533 | 533 |
534 // static | 534 // static |
535 bool BrowserThread::PostBlockingPoolTask( | 535 bool BrowserThread::PostBlockingPoolTask( |
536 const tracked_objects::Location& from_here, | 536 const tracked_objects::Location& from_here, |
537 base::Closure task) { | 537 base::OnceClosure task) { |
538 return g_globals.Get().blocking_pool->PostWorkerTask(from_here, | 538 return g_globals.Get().blocking_pool->PostWorkerTask(from_here, |
539 std::move(task)); | 539 std::move(task)); |
540 } | 540 } |
541 | 541 |
542 // static | 542 // static |
543 bool BrowserThread::PostBlockingPoolTaskAndReply( | 543 bool BrowserThread::PostBlockingPoolTaskAndReply( |
544 const tracked_objects::Location& from_here, | 544 const tracked_objects::Location& from_here, |
545 base::Closure task, | 545 base::OnceClosure task, |
546 base::Closure reply) { | 546 base::OnceClosure reply) { |
547 return g_globals.Get().blocking_pool->PostTaskAndReply( | 547 return g_globals.Get().blocking_pool->PostTaskAndReply( |
548 from_here, std::move(task), std::move(reply)); | 548 from_here, std::move(task), std::move(reply)); |
549 } | 549 } |
550 | 550 |
551 // static | 551 // static |
552 bool BrowserThread::PostBlockingPoolSequencedTask( | 552 bool BrowserThread::PostBlockingPoolSequencedTask( |
553 const std::string& sequence_token_name, | 553 const std::string& sequence_token_name, |
554 const tracked_objects::Location& from_here, | 554 const tracked_objects::Location& from_here, |
555 base::Closure task) { | 555 base::OnceClosure task) { |
556 return g_globals.Get().blocking_pool->PostNamedSequencedWorkerTask( | 556 return g_globals.Get().blocking_pool->PostNamedSequencedWorkerTask( |
557 sequence_token_name, from_here, std::move(task)); | 557 sequence_token_name, from_here, std::move(task)); |
558 } | 558 } |
559 | 559 |
560 // static | 560 // static |
561 void BrowserThread::PostAfterStartupTask( | 561 void BrowserThread::PostAfterStartupTask( |
562 const tracked_objects::Location& from_here, | 562 const tracked_objects::Location& from_here, |
563 const scoped_refptr<base::TaskRunner>& task_runner, | 563 const scoped_refptr<base::TaskRunner>& task_runner, |
564 base::Closure task) { | 564 base::OnceClosure task) { |
565 GetContentClient()->browser()->PostAfterStartupTask(from_here, task_runner, | 565 GetContentClient()->browser()->PostAfterStartupTask(from_here, task_runner, |
566 std::move(task)); | 566 std::move(task)); |
567 } | 567 } |
568 | 568 |
569 // static | 569 // static |
570 base::SequencedWorkerPool* BrowserThread::GetBlockingPool() { | 570 base::SequencedWorkerPool* BrowserThread::GetBlockingPool() { |
571 return g_globals.Get().blocking_pool.get(); | 571 return g_globals.Get().blocking_pool.get(); |
572 } | 572 } |
573 | 573 |
574 // static | 574 // static |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 BrowserThreadGlobals& globals = g_globals.Get(); | 616 BrowserThreadGlobals& globals = g_globals.Get(); |
617 base::AutoLock lock(globals.lock); | 617 base::AutoLock lock(globals.lock); |
618 DCHECK_GE(identifier, 0); | 618 DCHECK_GE(identifier, 0); |
619 DCHECK_LT(identifier, ID_COUNT); | 619 DCHECK_LT(identifier, ID_COUNT); |
620 return globals.states[identifier] == BrowserThreadState::RUNNING; | 620 return globals.states[identifier] == BrowserThreadState::RUNNING; |
621 } | 621 } |
622 | 622 |
623 // static | 623 // static |
624 bool BrowserThread::PostTask(ID identifier, | 624 bool BrowserThread::PostTask(ID identifier, |
625 const tracked_objects::Location& from_here, | 625 const tracked_objects::Location& from_here, |
626 base::Closure task) { | 626 base::OnceClosure task) { |
627 return BrowserThreadImpl::PostTaskHelper( | 627 return BrowserThreadImpl::PostTaskHelper( |
628 identifier, from_here, std::move(task), base::TimeDelta(), true); | 628 identifier, from_here, std::move(task), base::TimeDelta(), true); |
629 } | 629 } |
630 | 630 |
631 // static | 631 // static |
632 bool BrowserThread::PostDelayedTask(ID identifier, | 632 bool BrowserThread::PostDelayedTask(ID identifier, |
633 const tracked_objects::Location& from_here, | 633 const tracked_objects::Location& from_here, |
634 base::Closure task, | 634 base::OnceClosure task, |
635 base::TimeDelta delay) { | 635 base::TimeDelta delay) { |
636 return BrowserThreadImpl::PostTaskHelper(identifier, from_here, | 636 return BrowserThreadImpl::PostTaskHelper(identifier, from_here, |
637 std::move(task), delay, true); | 637 std::move(task), delay, true); |
638 } | 638 } |
639 | 639 |
640 // static | 640 // static |
641 bool BrowserThread::PostNonNestableTask( | 641 bool BrowserThread::PostNonNestableTask( |
642 ID identifier, | 642 ID identifier, |
643 const tracked_objects::Location& from_here, | 643 const tracked_objects::Location& from_here, |
644 base::Closure task) { | 644 base::OnceClosure task) { |
645 return BrowserThreadImpl::PostTaskHelper( | 645 return BrowserThreadImpl::PostTaskHelper( |
646 identifier, from_here, std::move(task), base::TimeDelta(), false); | 646 identifier, from_here, std::move(task), base::TimeDelta(), false); |
647 } | 647 } |
648 | 648 |
649 // static | 649 // static |
650 bool BrowserThread::PostNonNestableDelayedTask( | 650 bool BrowserThread::PostNonNestableDelayedTask( |
651 ID identifier, | 651 ID identifier, |
652 const tracked_objects::Location& from_here, | 652 const tracked_objects::Location& from_here, |
653 base::Closure task, | 653 base::OnceClosure task, |
654 base::TimeDelta delay) { | 654 base::TimeDelta delay) { |
655 return BrowserThreadImpl::PostTaskHelper(identifier, from_here, | 655 return BrowserThreadImpl::PostTaskHelper(identifier, from_here, |
656 std::move(task), delay, false); | 656 std::move(task), delay, false); |
657 } | 657 } |
658 | 658 |
659 // static | 659 // static |
660 bool BrowserThread::PostTaskAndReply(ID identifier, | 660 bool BrowserThread::PostTaskAndReply(ID identifier, |
661 const tracked_objects::Location& from_here, | 661 const tracked_objects::Location& from_here, |
662 base::Closure task, | 662 base::OnceClosure task, |
663 base::Closure reply) { | 663 base::OnceClosure reply) { |
664 return GetTaskRunnerForThread(identifier) | 664 return GetTaskRunnerForThread(identifier) |
665 ->PostTaskAndReply(from_here, std::move(task), std::move(reply)); | 665 ->PostTaskAndReply(from_here, std::move(task), std::move(reply)); |
666 } | 666 } |
667 | 667 |
668 // static | 668 // static |
669 bool BrowserThread::GetCurrentThreadIdentifier(ID* identifier) { | 669 bool BrowserThread::GetCurrentThreadIdentifier(ID* identifier) { |
670 if (g_globals == nullptr) | 670 if (g_globals == nullptr) |
671 return false; | 671 return false; |
672 | 672 |
673 BrowserThreadGlobals& globals = g_globals.Get(); | 673 BrowserThreadGlobals& globals = g_globals.Get(); |
(...skipping 25 matching lines...) Expand all Loading... |
699 BrowserThreadDelegateAtomicPtr old_delegate = | 699 BrowserThreadDelegateAtomicPtr old_delegate = |
700 base::subtle::NoBarrier_AtomicExchange( | 700 base::subtle::NoBarrier_AtomicExchange( |
701 &globals.io_thread_delegate, | 701 &globals.io_thread_delegate, |
702 reinterpret_cast<BrowserThreadDelegateAtomicPtr>(delegate)); | 702 reinterpret_cast<BrowserThreadDelegateAtomicPtr>(delegate)); |
703 | 703 |
704 // This catches registration when previously registered. | 704 // This catches registration when previously registered. |
705 DCHECK(!delegate || !old_delegate); | 705 DCHECK(!delegate || !old_delegate); |
706 } | 706 } |
707 | 707 |
708 } // namespace content | 708 } // namespace content |
OLD | NEW |