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
10namespace fml {
11
12const int RasterThreadMerger::kLeaseNotSet = -1;
13
14RasterThreadMerger::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
23void 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
31bool RasterThreadMerger::IsOnPlatformThread() const {
32 return MessageLoop::GetCurrentTaskQueueId() == platform_queue_id_;
33}
34
35bool RasterThreadMerger::IsOnRasterizingThread() const {
36 if (is_merged_) {
37 return IsOnPlatformThread();
38 } else {
39 return !IsOnPlatformThread();
40 }
41}
42
43void 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
51bool RasterThreadMerger::IsMerged() const {
52 return is_merged_;
53}
54
55RasterThreadStatus 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