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