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