1 /*
2  * Copyright (c) 2024 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 #ifndef META_EXT_TASK_QUEUE_H
17 #define META_EXT_TASK_QUEUE_H
18 
19 #include <meta/ext/object.h>
20 #include <meta/interface/interface_helpers.h>
21 #include <meta/interface/intf_promise.h>
22 #include <meta/interface/intf_task_queue_extend.h>
23 
META_BEGIN_NAMESPACE()24 META_BEGIN_NAMESPACE()
25 
26 class PromisedQueueTask : public IntroduceInterfaces<ITaskQueueTask, ITaskScheduleInfo> {
27 public:
28     PromisedQueueTask(ITaskQueueWaitableTask::Ptr task, IPromise::Ptr p)
29         : task_(BASE_NS::move(task)), promise_(BASE_NS::move(p))
30     {}
31 
32     bool Invoke() override
33     {
34         auto res = task_->Invoke();
35         // make sure the task is destroyed before future wait returns,
36         // so that any captured objects are also destroyed.
37         task_.reset();
38         promise_->Set(BASE_NS::move(res));
39         return false;
40     }
41 
42     void SetQueueAndToken(const ITaskQueue::Ptr& q, ITaskQueue::Token t) override
43     {
44         promise_->SetQueueInfo(q, t);
45     }
46 
47     [[nodiscard]] IFuture::Ptr GetFuture()
48     {
49         return promise_->GetFuture();
50     }
51 
52     IPromise::Ptr GetPromise()
53     {
54         return promise_;
55     }
56 
57 private:
58     ITaskQueueWaitableTask::Ptr task_;
59     IPromise::Ptr promise_;
60 };
61 
62 template<class FinalClass, const ClassInfo& Info, const ClassInfo& SuperInfo, class... Interfaces>
63 class TaskQueueFwd : public BaseObjectFwd<FinalClass, Info, SuperInfo, ITaskQueueExtend, Interfaces...> {
64 public:
Build(const IMetadata::Ptr & data)65     bool Build(const IMetadata::Ptr& data) override
66     {
67         SetExtend(this->template GetSelf<ITaskQueueExtend>().get());
68         return true;
69     }
70 
71 public:
72     using Token = ITaskQueue::Token;
73 
AddTask(ITaskQueueTask::Ptr p)74     Token AddTask(ITaskQueueTask::Ptr p) override
75     {
76         return this->template GetBaseAs<ITaskQueue>()->AddTask(BASE_NS::move(p));
77     }
AddTask(ITaskQueueTask::Ptr p,const TimeSpan & delay)78     Token AddTask(ITaskQueueTask::Ptr p, const TimeSpan& delay) override
79     {
80         return this->template GetBaseAs<ITaskQueue>()->AddTask(BASE_NS::move(p), delay);
81     }
AddWaitableTask(ITaskQueueWaitableTask::Ptr p)82     IFuture::Ptr AddWaitableTask(ITaskQueueWaitableTask::Ptr p) override
83     {
84         return this->template GetBaseAs<ITaskQueue>()->AddWaitableTask(BASE_NS::move(p));
85     }
CancelTask(Token t)86     void CancelTask(Token t) override
87     {
88         this->template GetBaseAs<ITaskQueue>()->CancelTask(t);
89     }
90 
91 public:
SetExtend(ITaskQueueExtend * extend)92     void SetExtend(ITaskQueueExtend* extend) override
93     {
94         this->template GetBaseAs<ITaskQueueExtend>()->SetExtend(extend);
95     }
InvokeTask(const ITaskQueueTask::Ptr & task)96     bool InvokeTask(const ITaskQueueTask::Ptr& task) override
97     {
98         return this->template GetBaseAs<ITaskQueueExtend>()->InvokeTask(task);
99     }
Shutdown()100     void Shutdown() override
101     {
102         this->template GetBaseAs<ITaskQueueExtend>()->Shutdown();
103     }
104 
105 private:
106 };
107 
108 META_END_NAMESPACE()
109 
110 #endif
111