@@ -17,58 +17,97 @@ RasterThreadMerger::RasterThreadMerger(fml::TaskQueueId platform_queue_id,
1717 gpu_queue_id_ (gpu_queue_id),
1818 task_queues_(fml::MessageLoopTaskQueues::GetInstance()),
1919 lease_term_(kLeaseNotSet ) {
20- is_merged_ = task_queues_->Owns (platform_queue_id_, gpu_queue_id_);
20+ FML_CHECK (! task_queues_->Owns (platform_queue_id_, gpu_queue_id_) );
2121}
2222
2323void RasterThreadMerger::MergeWithLease (size_t lease_term) {
24+ if (TaskQueuesAreSame ()) {
25+ return ;
26+ }
27+
2428 FML_DCHECK (lease_term > 0 ) << " lease_term should be positive." ;
25- if (!is_merged_) {
26- is_merged_ = task_queues_->Merge (platform_queue_id_, gpu_queue_id_);
29+ std::scoped_lock lock (lease_term_mutex_);
30+ if (!IsMergedUnSafe ()) {
31+ bool success = task_queues_->Merge (platform_queue_id_, gpu_queue_id_);
32+ FML_CHECK (success) << " Unable to merge the raster and platform threads." ;
2733 lease_term_ = lease_term;
2834 }
35+ merged_condition_.notify_one ();
36+ }
37+
38+ void RasterThreadMerger::UnMergeNow () {
39+ if (TaskQueuesAreSame ()) {
40+ return ;
41+ }
42+
43+ std::scoped_lock lock (lease_term_mutex_);
44+ lease_term_ = 0 ;
45+ bool success = task_queues_->Unmerge (platform_queue_id_);
46+ FML_CHECK (success) << " Unable to un-merge the raster and platform threads." ;
2947}
3048
3149bool RasterThreadMerger::IsOnPlatformThread () const {
3250 return MessageLoop::GetCurrentTaskQueueId () == platform_queue_id_;
3351}
3452
35- bool RasterThreadMerger::IsOnRasterizingThread () const {
36- if (is_merged_ ) {
53+ bool RasterThreadMerger::IsOnRasterizingThread () {
54+ if (IsMergedUnSafe () ) {
3755 return IsOnPlatformThread ();
3856 } else {
3957 return !IsOnPlatformThread ();
4058 }
4159}
4260
4361void RasterThreadMerger::ExtendLeaseTo (size_t lease_term) {
44- FML_DCHECK (lease_term > 0 ) << " lease_term should be positive." ;
62+ if (TaskQueuesAreSame ()) {
63+ return ;
64+ }
65+ std::scoped_lock lock (lease_term_mutex_);
66+ FML_DCHECK (IsMergedUnSafe ()) << " lease_term should be positive." ;
4567 if (lease_term_ != kLeaseNotSet &&
4668 static_cast <int >(lease_term) > lease_term_) {
4769 lease_term_ = lease_term;
4870 }
4971}
5072
51- bool RasterThreadMerger::IsMerged () const {
52- return is_merged_;
73+ bool RasterThreadMerger::IsMerged () {
74+ std::scoped_lock lock (lease_term_mutex_);
75+ return IsMergedUnSafe ();
5376}
5477
55- RasterThreadStatus RasterThreadMerger::DecrementLease () {
56- if (!is_merged_) {
57- return RasterThreadStatus::kRemainsUnmerged ;
78+ bool RasterThreadMerger::IsMergedUnSafe () {
79+ return lease_term_ > 0 || TaskQueuesAreSame ();
80+ }
81+
82+ bool RasterThreadMerger::TaskQueuesAreSame () {
83+ return platform_queue_id_ == gpu_queue_id_;
84+ }
85+
86+ void RasterThreadMerger::WaitUntilMerged () {
87+ if (TaskQueuesAreSame ()) {
88+ return ;
5889 }
90+ FML_CHECK (IsOnPlatformThread ());
91+ std::unique_lock<std::mutex> lock (lease_term_mutex_);
92+ merged_condition_.wait (lock, [&] { return IsMergedUnSafe (); });
93+ }
5994
60- // we haven't been set to merge.
61- if (lease_term_ == kLeaseNotSet ) {
95+ RasterThreadStatus RasterThreadMerger::DecrementLease () {
96+ if (TaskQueuesAreSame ()) {
97+ return RasterThreadStatus::kRemainsMerged ;
98+ }
99+ std::unique_lock<std::mutex> lock (lease_term_mutex_);
100+ if (!IsMergedUnSafe ()) {
62101 return RasterThreadStatus::kRemainsUnmerged ;
63102 }
64103
65104 FML_DCHECK (lease_term_ > 0 )
66105 << " lease_term should always be positive when merged." ;
67106 lease_term_--;
68107 if (lease_term_ == 0 ) {
69- bool success = task_queues_-> Unmerge (platform_queue_id_);
70- FML_CHECK (success) << " Unable to un-merge the raster and platform threads. " ;
71- is_merged_ = false ;
108+ // |UnMergeNow| is going to acquire the lock again.
109+ lock. unlock () ;
110+ UnMergeNow () ;
72111 return RasterThreadStatus::kUnmergedNow ;
73112 }
74113
0 commit comments