1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "rs_thread_handler_generic.h"
17
18 namespace OHOS {
19 namespace Rosen {
Create()20 std::unique_ptr<RSThreadHandler> RSThreadHandler::Create()
21 {
22 return std::make_unique<RSThreadHandlerGeneric>();
23 }
24
RSThreadHandlerGeneric()25 RSThreadHandlerGeneric::RSThreadHandlerGeneric()
26 {
27 looper_ = ThreadLooperImpl::GetThreadInstance();
28 }
29
30 class GenericMessageHandler final : public ThreadLooperMessage {
31 public:
GenericMessageHandler(const RSTaskMessage::RSTask task)32 explicit GenericMessageHandler(const RSTaskMessage::RSTask task) : task_(task) {}
33
34 ~GenericMessageHandler() override = default;
35
Process(int param) const36 void Process(int param) const override
37 {
38 if (task_) {
39 task_();
40 }
41 }
42
43 private:
44 RSTaskMessage::RSTask task_ = nullptr;
45 };
46
47 class GenericThreadMessage final : public RSTaskMessage {
48 public:
GenericThreadMessage(const RSTaskMessage::RSTask task)49 explicit GenericThreadMessage(const RSTaskMessage::RSTask task) : messageHandler_(new GenericMessageHandler(task))
50 {}
51 ~GenericThreadMessage() = default;
52
GetMessageHandler() const53 const std::shared_ptr<GenericMessageHandler>& GetMessageHandler() const
54 {
55 return messageHandler_;
56 }
57
58 private:
59 std::shared_ptr<GenericMessageHandler> messageHandler_;
60 };
61
CreateTask(const RSTaskMessage::RSTask task) const62 RSTaskHandle RSThreadHandlerGeneric::CreateTask(const RSTaskMessage::RSTask task) const
63 {
64 return std::make_shared<GenericThreadMessage>(task);
65 }
66
PostTask(const RSTaskHandle taskHandle,int param)67 void RSThreadHandlerGeneric::PostTask(const RSTaskHandle taskHandle, int param)
68 {
69 if (!looper_) {
70 return;
71 }
72 auto* msg = static_cast<GenericThreadMessage*>(taskHandle.get());
73 if (msg != nullptr) {
74 looper_->PostMessage(msg->GetMessageHandler(), param);
75 }
76 }
77
PostTaskDelay(const RSTaskHandle taskHandle,int64_t nsecs,int param)78 void RSThreadHandlerGeneric::PostTaskDelay(const RSTaskHandle taskHandle, int64_t nsecs, int param)
79 {
80 if (!looper_) {
81 return;
82 }
83 auto* msg = static_cast<GenericThreadMessage*>(taskHandle.get());
84 if (msg != nullptr) {
85 looper_->PostMessage(nsecs, msg->GetMessageHandler(), param);
86 }
87 }
88
CancelTask(RSTaskHandle taskHandle)89 void RSThreadHandlerGeneric::CancelTask(RSTaskHandle taskHandle)
90 {
91 if (!looper_) {
92 return;
93 }
94 auto* msg = static_cast<GenericThreadMessage*>(taskHandle.get());
95 if (msg != nullptr) {
96 looper_->RemoveMessages(msg->GetMessageHandler());
97 }
98 }
99
StaticCreateTask(const RSTaskMessage::RSTask task)100 RSTaskHandle RSThreadHandler::StaticCreateTask(const RSTaskMessage::RSTask task)
101 {
102 return std::make_shared<GenericThreadMessage>(task);
103 }
104 } // namespace Rosen
105 } // namespace OHOS
106