1 /*
2  * Copyright (c) 2023 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  /**
17  * @file task.h
18  *
19  * @brief Declares the task interfaces in C++.
20  *
21  * @since 10
22  * @version 1.0
23  */
24 #ifndef FFRT_API_CPP_TASK_H
25 #define FFRT_API_CPP_TASK_H
26 #include <string>
27 #include <vector>
28 #include <functional>
29 #include "c/task.h"
30 
31 namespace ffrt {
32 class task_attr : public ffrt_task_attr_t {
33 public:
34 #if __has_builtin(__builtin_FUNCTION)
task_attr(const char* func = __builtin_FUNCTION())35     task_attr(const char* func = __builtin_FUNCTION())
36     {
37         ffrt_task_attr_init(this);
38         ffrt_task_attr_set_name(this, func);
39     }
40 #else
41     task_attr()
42     {
43         ffrt_task_attr_init(this);
44     }
45 #endif
46 
~task_attr()47     ~task_attr()
48     {
49         ffrt_task_attr_destroy(this);
50     }
51 
52     task_attr(const task_attr&) = delete;
53     task_attr& operator=(const task_attr&) = delete;
54 
55     /**
56      * @brief Sets a task name.
57      *
58      * @param name Indicates a pointer to the task name.
59      * @since 10
60      * @version 1.0
61      */
name(const char* name)62     inline task_attr& name(const char* name)
63     {
64         ffrt_task_attr_set_name(this, name);
65         return *this;
66     }
67 
68     /**
69      * @brief Obtains the task name.
70      *
71      * @return Returns a pointer to the task name.
72      * @since 10
73      * @version 1.0
74      */
name() const75     inline const char* name() const
76     {
77         return ffrt_task_attr_get_name(this);
78     }
79 
80     /**
81      * @brief Sets the QoS for this task.
82      *
83      * @param qos Indicates the QoS.
84      * @since 10
85      * @version 1.0
86      */
qos(qos qos_)87     inline task_attr& qos(qos qos_)
88     {
89         ffrt_task_attr_set_qos(this, qos_);
90         return *this;
91     }
92 
93     /**
94      * @brief Obtains the QoS of this task.
95      *
96      * @return Returns the QoS.
97      * @since 10
98      * @version 1.0
99      */
qos() const100     inline int qos() const
101     {
102         return ffrt_task_attr_get_qos(this);
103     }
104 
105     /**
106      * @brief Sets the delay time for this task.
107      *
108      * @param delay_us Indicates the delay time, in microseconds.
109      * @since 10
110      * @version 1.0
111      */
delay(uint64_t delay_us)112     inline task_attr& delay(uint64_t delay_us)
113     {
114         ffrt_task_attr_set_delay(this, delay_us);
115         return *this;
116     }
117 
118     /**
119      * @brief Obtains the delay time of this task.
120      *
121      * @return Returns the delay time.
122      * @since 10
123      * @version 1.0
124      */
delay() const125     inline uint64_t delay() const
126     {
127         return ffrt_task_attr_get_delay(this);
128     }
129 
130     /**
131      * @brief Sets the priority for this task.
132      *
133      * @param priority Indicates the execute priority of concurrent queue task.
134      * @since 12
135      * @version 1.0
136      */
priority(ffrt_queue_priority_t prio)137     inline task_attr& priority(ffrt_queue_priority_t prio)
138     {
139         ffrt_task_attr_set_queue_priority(this, prio);
140         return *this;
141     }
142 
143     /**
144      * @brief Obtains the priority of this task.
145      *
146      * @return Returns the priority of concurrent queue task.
147      * @since 12
148      * @version 1.0
149      */
priority() const150     inline ffrt_queue_priority_t priority() const
151     {
152         return ffrt_task_attr_get_queue_priority(this);
153     }
154 
155     /**
156      * @brief Sets the stack size for this task.
157      *
158      * @param size Indicates the task stack size, unit is byte.
159      * @since 12
160      * @version 1.0
161      */
stack_size(uint64_t size)162     inline task_attr& stack_size(uint64_t size)
163     {
164         ffrt_task_attr_set_stack_size(this, size);
165         return *this;
166     }
167 
168     /**
169      * @brief Obtains the stack size of this task.
170      *
171      * @return Returns task stack size, unit is byte.
172      * @since 12
173      * @version 1.0
174      */
stack_size() const175     inline uint64_t stack_size() const
176     {
177         return ffrt_task_attr_get_stack_size(this);
178     }
179 };
180 
181 class task_handle {
182 public:
task_handle()183     task_handle() : p(nullptr)
184     {
185     }
task_handle(ffrt_task_handle_t p)186     task_handle(ffrt_task_handle_t p) : p(p)
187     {
188     }
189 
~task_handle()190     ~task_handle()
191     {
192         if (p) {
193             ffrt_task_handle_destroy(p);
194         }
195     }
196 
197     task_handle(task_handle const&) = delete;
198     task_handle& operator=(task_handle const&) = delete;
199 
task_handle(task_handle&& h)200     inline task_handle(task_handle&& h)
201     {
202         *this = std::move(h);
203     }
204 
operator =(task_handle&& h)205     inline task_handle& operator=(task_handle&& h)
206     {
207         if (this != &h) {
208             if (p) {
209                 ffrt_task_handle_destroy(p);
210             }
211             p = h.p;
212             h.p = nullptr;
213         }
214         return *this;
215     }
216 
operator void*() const217     inline operator void* () const
218     {
219         return p;
220     }
221 
222 private:
223     ffrt_task_handle_t p = nullptr;
224 };
225 
226 struct dependence : ffrt_dependence_t {
dependenceffrt::dependence227     dependence(const void* d)
228     {
229         type = ffrt_dependence_data;
230         ptr = d;
231     }
dependenceffrt::dependence232     dependence(const task_handle& h)
233     {
234         type = ffrt_dependence_task;
235         ptr = h;
236         ffrt_task_handle_inc_ref(const_cast<ffrt_task_handle_t>(ptr));
237     }
238 
dependenceffrt::dependence239     dependence(const dependence& other)
240     {
241         (*this) = other;
242     }
243 
dependenceffrt::dependence244     dependence(dependence&& other)
245     {
246         (*this) = std::move(other);
247     }
248 
operator =ffrt::dependence249     dependence& operator=(const dependence& other)
250     {
251         if (this != &other) {
252             type = other.type;
253             ptr = other.ptr;
254             if (type == ffrt_dependence_task) {
255                 ffrt_task_handle_inc_ref(const_cast<ffrt_task_handle_t>(ptr));
256             }
257         }
258         return *this;
259     }
260 
operator =ffrt::dependence261     dependence& operator=(dependence&& other)
262     {
263         if (this != &other) {
264             type = other.type;
265             ptr = other.ptr;
266             other.ptr = nullptr;
267         }
268         return *this;
269     }
270 
~dependenceffrt::dependence271     ~dependence()
272     {
273         if (type == ffrt_dependence_task && ptr) {
274             ffrt_task_handle_dec_ref(const_cast<ffrt_task_handle_t>(ptr));
275         }
276     }
277 };
278 
279 template<class T>
280 struct function {
281     ffrt_function_header_t header;
282     T closure;
283 };
284 
285 template<class T>
exec_function_wrapper(void* t)286 void exec_function_wrapper(void* t)
287 {
288     auto f = reinterpret_cast<function<std::decay_t<T>>*>(t);
289     f->closure();
290 }
291 
292 template<class T>
destroy_function_wrapper(void* t)293 void destroy_function_wrapper(void* t)
294 {
295     auto f = reinterpret_cast<function<std::decay_t<T>>*>(t);
296     f->closure = nullptr;
297 }
298 
299 template<class T>
create_function_wrapper(T&& func, ffrt_function_kind_t kind = ffrt_function_kind_general)300 inline ffrt_function_header_t* create_function_wrapper(T&& func,
301     ffrt_function_kind_t kind = ffrt_function_kind_general)
302 {
303     using function_type = function<std::decay_t<T>>;
304     static_assert(sizeof(function_type) <= ffrt_auto_managed_function_storage_size,
305         "size of function must be less than ffrt_auto_managed_function_storage_size");
306 
307     auto p = ffrt_alloc_auto_managed_function_storage_base(kind);
308     auto f = new (p)function_type;
309     f->header.exec = exec_function_wrapper<T>;
310     f->header.destroy = destroy_function_wrapper<T>;
311     f->closure = std::forward<T>(func);
312     return reinterpret_cast<ffrt_function_header_t*>(f);
313 }
314 
315 /**
316  * @brief Submits a task without input and output dependencies.
317  *
318  * @param func Indicates a task executor function closure.
319  * @param attr Indicates a task attribute.
320  * @since 10
321  * @version 1.0
322  */
submit(std::function<void()>&& func, const task_attr& attr = {})323 static inline void submit(std::function<void()>&& func, const task_attr& attr = {})
324 {
325     return ffrt_submit_base(create_function_wrapper(std::move(func)), nullptr, nullptr, &attr);
326 }
327 
328 /**
329  * @brief Submits a task with input dependencies only.
330  *
331  * @param func Indicates a task executor function closure.
332  * @param in_deps Indicates a pointer to the input dependencies.
333  * @param attr Indicates a task attribute.
334  * @since 10
335  * @version 1.0
336  */
submit(std::function<void()>&& func, std::initializer_list<dependence> in_deps, const task_attr& attr = {})337 static inline void submit(std::function<void()>&& func, std::initializer_list<dependence> in_deps,
338     const task_attr& attr = {})
339 {
340     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.begin()};
341     return ffrt_submit_base(create_function_wrapper(std::move(func)), &in, nullptr, &attr);
342 }
343 
344 /**
345  * @brief Submits a task with input and output dependencies.
346  *
347  * @param func Indicates a task executor function closure.
348  * @param in_deps Indicates a pointer to the input dependencies.
349  * @param out_deps Indicates a pointer to the output dependencies.
350  * @param attr Indicates a task attribute.
351  * @since 10
352  * @version 1.0
353  */
submit(std::function<void()>&& func, std::initializer_list<dependence> in_deps, std::initializer_list<dependence> out_deps, const task_attr& attr = {})354 static inline void submit(std::function<void()>&& func, std::initializer_list<dependence> in_deps,
355     std::initializer_list<dependence> out_deps, const task_attr& attr = {})
356 {
357     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.begin()};
358     ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.begin()};
359     return ffrt_submit_base(create_function_wrapper(std::move(func)), &in, &out, &attr);
360 }
361 
362 /**
363  * @brief Submits a task with input dependencies only.
364  *
365  * @param func Indicates a task executor function closure.
366  * @param in_deps Indicates a pointer to the input dependencies.
367  * @param attr Indicates a task attribute.
368  * @since 10
369  * @version 1.0
370  */
submit(std::function<void()>&& func, const std::vector<dependence>& in_deps, const task_attr& attr = {})371 static inline void submit(std::function<void()>&& func, const std::vector<dependence>& in_deps,
372     const task_attr& attr = {})
373 {
374     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
375     return ffrt_submit_base(create_function_wrapper(std::move(func)), &in, nullptr, &attr);
376 }
377 
378 /**
379  * @brief Submits a task with input and output dependencies.
380  *
381  * @param func Indicates a task executor function closure.
382  * @param in_deps Indicates a pointer to the input dependencies.
383  * @param out_deps Indicates a pointer to the output dependencies.
384  * @param attr Indicates a task attribute.
385  * @since 10
386  * @version 1.0
387  */
submit(std::function<void()>&& func, const std::vector<dependence>& in_deps, const std::vector<dependence>& out_deps, const task_attr& attr = {})388 static inline void submit(std::function<void()>&& func, const std::vector<dependence>& in_deps,
389     const std::vector<dependence>& out_deps, const task_attr& attr = {})
390 {
391     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
392     ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.data()};
393     return ffrt_submit_base(create_function_wrapper(std::move(func)), &in, &out, &attr);
394 }
395 
396 /**
397  * @brief Submits a task without input and output dependencies.
398  *
399  * @param func Indicates a task executor function closure.
400  * @param attr Indicates a task attribute.
401  * @since 10
402  * @version 1.0
403  */
submit(const std::function<void()>& func, const task_attr& attr = {})404 static inline void submit(const std::function<void()>& func, const task_attr& attr = {})
405 {
406     return ffrt_submit_base(create_function_wrapper(func), nullptr, nullptr, &attr);
407 }
408 
409 /**
410  * @brief Submits a task with input dependencies only.
411  *
412  * @param func Indicates a task executor function closure.
413  * @param in_deps Indicates a pointer to the input dependencies.
414  * @param attr Indicates a task attribute.
415  * @since 10
416  * @version 1.0
417  */
submit(const std::function<void()>& func, std::initializer_list<dependence> in_deps, const task_attr& attr = {})418 static inline void submit(const std::function<void()>& func, std::initializer_list<dependence> in_deps,
419     const task_attr& attr = {})
420 {
421     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.begin()};
422     return ffrt_submit_base(create_function_wrapper(func), &in, nullptr, &attr);
423 }
424 
425 /**
426  * @brief Submits a task with input and output dependencies.
427  *
428  * @param func Indicates a task executor function closure.
429  * @param in_deps Indicates a pointer to the input dependencies.
430  * @param out_deps Indicates a pointer to the output dependencies.
431  * @param attr Indicates a task attribute.
432  * @since 10
433  * @version 1.0
434  */
submit(const std::function<void()>& func, std::initializer_list<dependence> in_deps, std::initializer_list<dependence> out_deps, const task_attr& attr = {})435 static inline void submit(const std::function<void()>& func, std::initializer_list<dependence> in_deps,
436     std::initializer_list<dependence> out_deps, const task_attr& attr = {})
437 {
438     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.begin()};
439     ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.begin()};
440     return ffrt_submit_base(create_function_wrapper(func), &in, &out, &attr);
441 }
442 
443 /**
444  * @brief Submits a task with input dependencies only.
445  *
446  * @param func Indicates a task executor function closure.
447  * @param in_deps Indicates a pointer to the input dependencies.
448  * @param attr Indicates a task attribute.
449  * @since 10
450  * @version 1.0
451  */
submit(const std::function<void()>& func, const std::vector<dependence>& in_deps, const task_attr& attr = {})452 static inline void submit(const std::function<void()>& func, const std::vector<dependence>& in_deps,
453     const task_attr& attr = {})
454 {
455     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
456     return ffrt_submit_base(create_function_wrapper(func), &in, nullptr, &attr);
457 }
458 
459 /**
460  * @brief Submits a task with input and output dependencies.
461  *
462  * @param func Indicates a task executor function closure.
463  * @param in_deps Indicates a pointer to the input dependencies.
464  * @param out_deps Indicates a pointer to the output dependencies.
465  * @param attr Indicates a task attribute.
466  * @since 10
467  * @version 1.0
468  */
submit(const std::function<void()>& func, const std::vector<dependence>& in_deps, const std::vector<dependence>& out_deps, const task_attr& attr = {})469 static inline void submit(const std::function<void()>& func, const std::vector<dependence>& in_deps,
470     const std::vector<dependence>& out_deps, const task_attr& attr = {})
471 {
472     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
473     ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.data()};
474     return ffrt_submit_base(create_function_wrapper(func), &in, &out, &attr);
475 }
476 
477 /**
478  * @brief Submits a task without input and output dependencies, and obtains a task handle.
479  *
480  * @param func Indicates a task executor function closure.
481  * @param attr Indicates a task attribute.
482  * @return Returns a non-null task handle if the task is submitted;
483            returns a null pointer otherwise.
484  * @since 10
485  * @version 1.0
486  */
submit_h(std::function<void()>&& func, const task_attr& attr = {})487 static inline task_handle submit_h(std::function<void()>&& func, const task_attr& attr = {})
488 {
489     return ffrt_submit_h_base(create_function_wrapper(std::move(func)), nullptr, nullptr, &attr);
490 }
491 
492 /**
493  * @brief Submits a task with input dependencies only, and obtains a task handle.
494  *
495  * @param func Indicates a task executor function closure.
496  * @param in_deps Indicates a pointer to the input dependencies.
497  * @param attr Indicates a task attribute.
498  * @return Returns a non-null task handle if the task is submitted;
499            returns a null pointer otherwise.
500  * @since 10
501  * @version 1.0
502  */
submit_h(std::function<void()>&& func, std::initializer_list<dependence> in_deps, const task_attr& attr = {})503 static inline task_handle submit_h(std::function<void()>&& func, std::initializer_list<dependence> in_deps,
504     const task_attr& attr = {})
505 {
506     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.begin()};
507     return ffrt_submit_h_base(create_function_wrapper(std::move(func)), &in, nullptr, &attr);
508 }
509 
510 /**
511  * @brief Submits a task with input and output dependencies, and obtains a task handle.
512  *
513  * @param func Indicates a task executor function closure.
514  * @param in_deps Indicates a pointer to the input dependencies.
515  * @param out_deps Indicates a pointer to the output dependencies.
516  * @param attr Indicates a task attribute.
517  * @return Returns a non-null task handle if the task is submitted;
518            returns a null pointer otherwise.
519  * @since 10
520  * @version 1.0
521  */
submit_h(std::function<void()>&& func, std::initializer_list<dependence> in_deps, std::initializer_list<dependence> out_deps, const task_attr& attr = {})522 static inline task_handle submit_h(std::function<void()>&& func, std::initializer_list<dependence> in_deps,
523     std::initializer_list<dependence> out_deps, const task_attr& attr = {})
524 {
525     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.begin()};
526     ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.begin()};
527     return ffrt_submit_h_base(create_function_wrapper(std::move(func)), &in, &out, &attr);
528 }
529 
530 /**
531  * @brief Submits a task with input dependencies only, and obtains a task handle.
532  *
533  * @param func Indicates a task executor function closure.
534  * @param in_deps Indicates a pointer to the input dependencies.
535  * @param attr Indicates a task attribute.
536  * @return Returns a non-null task handle if the task is submitted;
537            returns a null pointer otherwise.
538  * @since 10
539  * @version 1.0
540  */
submit_h(std::function<void()>&& func, const std::vector<dependence>& in_deps, const task_attr& attr = {})541 static inline task_handle submit_h(std::function<void()>&& func, const std::vector<dependence>& in_deps,
542     const task_attr& attr = {})
543 {
544     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
545     return ffrt_submit_h_base(create_function_wrapper(std::move(func)), &in, nullptr, &attr);
546 }
547 
548 /**
549  * @brief Submits a task with input and output dependencies, and obtains a task handle.
550  *
551  * @param func Indicates a task executor function closure.
552  * @param in_deps Indicates a pointer to the input dependencies.
553  * @param out_deps Indicates a pointer to the output dependencies.
554  * @param attr Indicates a task attribute.
555  * @return Returns a non-null task handle if the task is submitted;
556            returns a null pointer otherwise.
557  * @since 10
558  * @version 1.0
559  */
submit_h(std::function<void()>&& func, const std::vector<dependence>& in_deps, const std::vector<dependence>& out_deps, const task_attr& attr = {})560 static inline task_handle submit_h(std::function<void()>&& func, const std::vector<dependence>& in_deps,
561     const std::vector<dependence>& out_deps, const task_attr& attr = {})
562 {
563     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
564     ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.data()};
565     return ffrt_submit_h_base(create_function_wrapper(std::move(func)), &in, &out, &attr);
566 }
567 
568 /**
569  * @brief Submits a task without input and output dependencies, and obtains a task handle.
570  *
571  * @param func Indicates a task executor function closure.
572  * @param attr Indicates a task attribute.
573  * @return Returns a non-null task handle if the task is submitted;
574            returns a null pointer otherwise.
575  * @since 10
576  * @version 1.0
577  */
submit_h(const std::function<void()>& func, const task_attr& attr = {})578 static inline task_handle submit_h(const std::function<void()>& func, const task_attr& attr = {})
579 {
580     return ffrt_submit_h_base(create_function_wrapper(func), nullptr, nullptr, &attr);
581 }
582 
583 /**
584  * @brief Submits a task with input dependencies only, and obtains a task handle.
585  *
586  * @param func Indicates a task executor function closure.
587  * @param in_deps Indicates a pointer to the input dependencies.
588  * @param attr Indicates a task attribute.
589  * @return Returns a non-null task handle if the task is submitted;
590            returns a null pointer otherwise.
591  * @since 10
592  * @version 1.0
593  */
submit_h(const std::function<void()>& func, std::initializer_list<dependence> in_deps, const task_attr& attr = {})594 static inline task_handle submit_h(const std::function<void()>& func, std::initializer_list<dependence> in_deps,
595     const task_attr& attr = {})
596 {
597     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.begin()};
598     return ffrt_submit_h_base(create_function_wrapper(func), &in, nullptr, &attr);
599 }
600 
601 /**
602  * @brief Submits a task with input and output dependencies, and obtains a task handle.
603  *
604  * @param func Indicates a task executor function closure.
605  * @param in_deps Indicates a pointer to the input dependencies.
606  * @param out_deps Indicates a pointer to the output dependencies.
607  * @param attr Indicates a task attribute.
608  * @return Returns a non-null task handle if the task is submitted;
609            returns a null pointer otherwise.
610  * @since 10
611  * @version 1.0
612  */
submit_h(const std::function<void()>& func, std::initializer_list<dependence> in_deps, std::initializer_list<dependence> out_deps, const task_attr& attr = {})613 static inline task_handle submit_h(const std::function<void()>& func, std::initializer_list<dependence> in_deps,
614     std::initializer_list<dependence> out_deps, const task_attr& attr = {})
615 {
616     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.begin()};
617     ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.begin()};
618     return ffrt_submit_h_base(create_function_wrapper(func), &in, &out, &attr);
619 }
620 
621 /**
622  * @brief Submits a task with input dependencies only, and obtains a task handle.
623  *
624  * @param func Indicates a task executor function closure.
625  * @param in_deps Indicates a pointer to the input dependencies.
626  * @param attr Indicates a task attribute.
627  * @return Returns a non-null task handle if the task is submitted;
628            returns a null pointer otherwise.
629  * @since 10
630  * @version 1.0
631  */
submit_h(const std::function<void()>& func, const std::vector<dependence>& in_deps, const task_attr& attr = {})632 static inline task_handle submit_h(const std::function<void()>& func, const std::vector<dependence>& in_deps,
633     const task_attr& attr = {})
634 {
635     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
636     return ffrt_submit_h_base(create_function_wrapper(func), &in, nullptr, &attr);
637 }
638 
639 /**
640  * @brief Submits a task with input and output dependencies, and obtains a task handle.
641  *
642  * @param func Indicates a task executor function closure.
643  * @param in_deps Indicates a pointer to the input dependencies.
644  * @param out_deps Indicates a pointer to the output dependencies.
645  * @param attr Indicates a task attribute.
646  * @return Returns a non-null task handle if the task is submitted;
647            returns a null pointer otherwise.
648  * @since 10
649  * @version 1.0
650  */
submit_h(const std::function<void()>& func, const std::vector<dependence>& in_deps, const std::vector<dependence>& out_deps, const task_attr& attr = {})651 static inline task_handle submit_h(const std::function<void()>& func, const std::vector<dependence>& in_deps,
652     const std::vector<dependence>& out_deps, const task_attr& attr = {})
653 {
654     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
655     ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.data()};
656     return ffrt_submit_h_base(create_function_wrapper(func), &in, &out, &attr);
657 }
658 
659 /**
660  * @brief Waits until all submitted tasks are complete.
661  *
662  * @since 10
663  * @version 1.0
664  */
wait()665 static inline void wait()
666 {
667     ffrt_wait();
668 }
669 
670 /**
671  * @brief Waits until dependent tasks are complete.
672  *
673  * @param deps Indicates a pointer to the dependent tasks.
674  * @since 10
675  * @version 1.0
676  */
wait(std::initializer_list<dependence> deps)677 static inline void wait(std::initializer_list<dependence> deps)
678 {
679     ffrt_deps_t d{static_cast<uint32_t>(deps.size()), deps.begin()};
680     ffrt_wait_deps(&d);
681 }
682 
683 /**
684  * @brief Waits until dependent tasks are complete.
685  *
686  * @param deps Indicates a pointer to the dependent tasks.
687  * @since 10
688  * @version 1.0
689  */
wait(const std::vector<dependence>& deps)690 static inline void wait(const std::vector<dependence>& deps)
691 {
692     ffrt_deps_t d{static_cast<uint32_t>(deps.size()), deps.data()};
693     ffrt_wait_deps(&d);
694 }
695 
696 /**
697  * @brief Sets the thread stack size of a specified QoS level.
698  *
699  * @param qos_ Indicates the QoS.
700  * @param stack_size Indicates the thread stack size.
701  * @return Returns ffrt_success if the stack size set success;
702            returns ffrt_error_inval if qos_ or stack_size invalid;
703            returns ffrt_error otherwise.
704  * @since 10
705  * @version 1.0
706  */
set_worker_stack_size(qos qos_, size_t stack_size)707 static inline ffrt_error_t set_worker_stack_size(qos qos_, size_t stack_size)
708 {
709     return ffrt_set_worker_stack_size(qos_, stack_size);
710 }
711 
712 namespace this_task {
update_qos(qos qos_)713 static inline int update_qos(qos qos_)
714 {
715     return ffrt_this_task_update_qos(qos_);
716 }
717 
718 /**
719  * @brief Obtains the ID of this task.
720  *
721  * @return Returns the task ID.
722  * @since 10
723  * @version 1.0
724  */
get_id()725 static inline uint64_t get_id()
726 {
727     return ffrt_this_task_get_id();
728 }
729 } // namespace this_task
730 } // namespace ffrt
731 #endif
732