1 | // Copyright 2013 The Flutter Authors. All rights reserved. |
---|---|
2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. |
4 | |
5 | #define FML_USED_ON_EMBEDDER |
6 | |
7 | #include "flutter/fml/raster_thread_merger.h" |
8 | #include "flutter/fml/message_loop_impl.h" |
9 | |
10 | namespace fml { |
11 | |
12 | const int RasterThreadMerger::kLeaseNotSet = -1; |
13 | |
14 | RasterThreadMerger::RasterThreadMerger(fml::TaskQueueId platform_queue_id, |
15 | fml::TaskQueueId gpu_queue_id) |
16 | : platform_queue_id_(platform_queue_id), |
17 | gpu_queue_id_(gpu_queue_id), |
18 | task_queues_(fml::MessageLoopTaskQueues::GetInstance()), |
19 | lease_term_(kLeaseNotSet) { |
20 | is_merged_ = task_queues_->Owns(platform_queue_id_, gpu_queue_id_); |
21 | } |
22 | |
23 | void RasterThreadMerger::MergeWithLease(size_t lease_term) { |
24 | 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_); |
27 | lease_term_ = lease_term; |
28 | } |
29 | } |
30 | |
31 | bool RasterThreadMerger::IsOnPlatformThread() const { |
32 | return MessageLoop::GetCurrentTaskQueueId() == platform_queue_id_; |
33 | } |
34 | |
35 | bool RasterThreadMerger::IsOnRasterizingThread() const { |
36 | if (is_merged_) { |
37 | return IsOnPlatformThread(); |
38 | } else { |
39 | return !IsOnPlatformThread(); |
40 | } |
41 | } |
42 | |
43 | void RasterThreadMerger::ExtendLeaseTo(size_t lease_term) { |
44 | FML_DCHECK(lease_term > 0) << "lease_term should be positive."; |
45 | if (lease_term_ != kLeaseNotSet && |
46 | static_cast<int>(lease_term) > lease_term_) { |
47 | lease_term_ = lease_term; |
48 | } |
49 | } |
50 | |
51 | bool RasterThreadMerger::IsMerged() const { |
52 | return is_merged_; |
53 | } |
54 | |
55 | RasterThreadStatus RasterThreadMerger::DecrementLease() { |
56 | if (!is_merged_) { |
57 | return RasterThreadStatus::kRemainsUnmerged; |
58 | } |
59 | |
60 | // we haven't been set to merge. |
61 | if (lease_term_ == kLeaseNotSet) { |
62 | return RasterThreadStatus::kRemainsUnmerged; |
63 | } |
64 | |
65 | FML_DCHECK(lease_term_ > 0) |
66 | << "lease_term should always be positive when merged."; |
67 | lease_term_--; |
68 | 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; |
72 | return RasterThreadStatus::kUnmergedNow; |
73 | } |
74 | |
75 | return RasterThreadStatus::kRemainsMerged; |
76 | } |
77 | |
78 | } // namespace fml |
79 |