1484543d1Sopenharmony_ci/*
2484543d1Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3484543d1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4484543d1Sopenharmony_ci * you may not use this file except in compliance with the License.
5484543d1Sopenharmony_ci * You may obtain a copy of the License at
6484543d1Sopenharmony_ci *
7484543d1Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8484543d1Sopenharmony_ci *
9484543d1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10484543d1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11484543d1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12484543d1Sopenharmony_ci * See the License for the specific language governing permissions and
13484543d1Sopenharmony_ci * limitations under the License.
14484543d1Sopenharmony_ci */
15484543d1Sopenharmony_ci
16484543d1Sopenharmony_ci/**
17484543d1Sopenharmony_ci * @addtogroup Ffrt
18484543d1Sopenharmony_ci * @{
19484543d1Sopenharmony_ci *
20484543d1Sopenharmony_ci * @brief ffrt provides APIs.
21484543d1Sopenharmony_ci *
22484543d1Sopenharmony_ci *
23484543d1Sopenharmony_ci * @syscap SystemCapability.Resourceschedule.Ffrt.Core
24484543d1Sopenharmony_ci *
25484543d1Sopenharmony_ci * @since 10
26484543d1Sopenharmony_ci */
27484543d1Sopenharmony_ci
28484543d1Sopenharmony_ci/**
29484543d1Sopenharmony_ci * @file queue.h
30484543d1Sopenharmony_ci *
31484543d1Sopenharmony_ci * @brief Declares the queue interfaces in C.
32484543d1Sopenharmony_ci *
33484543d1Sopenharmony_ci * @syscap SystemCapability.Resourceschedule.Ffrt.Core
34484543d1Sopenharmony_ci * @since 10
35484543d1Sopenharmony_ci * @version 1.0
36484543d1Sopenharmony_ci */
37484543d1Sopenharmony_ci#ifndef FFRT_API_C_QUEUE_H
38484543d1Sopenharmony_ci#define FFRT_API_C_QUEUE_H
39484543d1Sopenharmony_ci
40484543d1Sopenharmony_ci#include "type_def.h"
41484543d1Sopenharmony_ci
42484543d1Sopenharmony_citypedef enum {
43484543d1Sopenharmony_ci    ffrt_queue_serial,
44484543d1Sopenharmony_ci    ffrt_queue_concurrent,
45484543d1Sopenharmony_ci    ffrt_queue_max
46484543d1Sopenharmony_ci} ffrt_queue_type_t;
47484543d1Sopenharmony_ci
48484543d1Sopenharmony_citypedef void* ffrt_queue_t;
49484543d1Sopenharmony_ci
50484543d1Sopenharmony_ci/**
51484543d1Sopenharmony_ci * @brief Initializes the queue attribute.
52484543d1Sopenharmony_ci *
53484543d1Sopenharmony_ci * @param attr Indicates a pointer to the queue attribute.
54484543d1Sopenharmony_ci * @return Returns <b>0</b> if the queue attribute is initialized;
55484543d1Sopenharmony_ci           returns <b>-1</b> otherwise.
56484543d1Sopenharmony_ci * @since 10
57484543d1Sopenharmony_ci * @version 1.0
58484543d1Sopenharmony_ci */
59484543d1Sopenharmony_ciFFRT_C_API int ffrt_queue_attr_init(ffrt_queue_attr_t* attr);
60484543d1Sopenharmony_ci
61484543d1Sopenharmony_ci/**
62484543d1Sopenharmony_ci * @brief Destroys a queue attribute.
63484543d1Sopenharmony_ci *
64484543d1Sopenharmony_ci * @param attr Indicates a pointer to the queue attribute.
65484543d1Sopenharmony_ci * @since 10
66484543d1Sopenharmony_ci * @version 1.0
67484543d1Sopenharmony_ci */
68484543d1Sopenharmony_ciFFRT_C_API void ffrt_queue_attr_destroy(ffrt_queue_attr_t* attr);
69484543d1Sopenharmony_ci
70484543d1Sopenharmony_ci/**
71484543d1Sopenharmony_ci * @brief Sets the QoS for a queue attribute.
72484543d1Sopenharmony_ci *
73484543d1Sopenharmony_ci * @param attr Indicates a pointer to the queue attribute.
74484543d1Sopenharmony_ci * @param attr Indicates the QoS.
75484543d1Sopenharmony_ci * @since 10
76484543d1Sopenharmony_ci * @version 1.0
77484543d1Sopenharmony_ci */
78484543d1Sopenharmony_ciFFRT_C_API void ffrt_queue_attr_set_qos(ffrt_queue_attr_t* attr, ffrt_qos_t qos);
79484543d1Sopenharmony_ci
80484543d1Sopenharmony_ci/**
81484543d1Sopenharmony_ci * @brief Obtains the QoS of a queue attribute.
82484543d1Sopenharmony_ci *
83484543d1Sopenharmony_ci * @param attr Indicates a pointer to the queue attribute.
84484543d1Sopenharmony_ci * @return Returns the QoS.
85484543d1Sopenharmony_ci * @since 10
86484543d1Sopenharmony_ci * @version 1.0
87484543d1Sopenharmony_ci */
88484543d1Sopenharmony_ciFFRT_C_API ffrt_qos_t ffrt_queue_attr_get_qos(const ffrt_queue_attr_t* attr);
89484543d1Sopenharmony_ci
90484543d1Sopenharmony_ci/**
91484543d1Sopenharmony_ci * @brief Set the serial queue task execution timeout.
92484543d1Sopenharmony_ci *
93484543d1Sopenharmony_ci * @param attr Serial Queue Property Pointer.
94484543d1Sopenharmony_ci * @param timeout_us Serial queue task execution timeout.
95484543d1Sopenharmony_ci * @since 10
96484543d1Sopenharmony_ci * @version 1.0
97484543d1Sopenharmony_ci */
98484543d1Sopenharmony_ciFFRT_C_API void ffrt_queue_attr_set_timeout(ffrt_queue_attr_t* attr, uint64_t timeout_us);
99484543d1Sopenharmony_ci
100484543d1Sopenharmony_ci/**
101484543d1Sopenharmony_ci * @brief Get the serial queue task execution timeout.
102484543d1Sopenharmony_ci *
103484543d1Sopenharmony_ci * @param attr Serial Queue Property Pointer.
104484543d1Sopenharmony_ci * @return Returns the serial queue task execution timeout.
105484543d1Sopenharmony_ci * @since 10
106484543d1Sopenharmony_ci * @version 1.0
107484543d1Sopenharmony_ci */
108484543d1Sopenharmony_ciFFRT_C_API uint64_t ffrt_queue_attr_get_timeout(const ffrt_queue_attr_t* attr);
109484543d1Sopenharmony_ci
110484543d1Sopenharmony_ci/**
111484543d1Sopenharmony_ci * @brief Set the serial queue timeout callback function.
112484543d1Sopenharmony_ci *
113484543d1Sopenharmony_ci * @param attr Serial Queue Property Pointer.
114484543d1Sopenharmony_ci * @param f Serial queue timeout callback function.
115484543d1Sopenharmony_ci * @since 10
116484543d1Sopenharmony_ci * @version 1.0
117484543d1Sopenharmony_ci */
118484543d1Sopenharmony_ciFFRT_C_API void ffrt_queue_attr_set_callback(ffrt_queue_attr_t* attr, ffrt_function_header_t* f);
119484543d1Sopenharmony_ci
120484543d1Sopenharmony_ci/**
121484543d1Sopenharmony_ci * @brief Get the serial queue task timeout callback function.
122484543d1Sopenharmony_ci *
123484543d1Sopenharmony_ci * @param attr Serial Queue Property Pointer.
124484543d1Sopenharmony_ci * @return Returns the serial queue task timeout callback function.
125484543d1Sopenharmony_ci * @since 10
126484543d1Sopenharmony_ci * @version 1.0
127484543d1Sopenharmony_ci */
128484543d1Sopenharmony_ciFFRT_C_API ffrt_function_header_t* ffrt_queue_attr_get_callback(const ffrt_queue_attr_t* attr);
129484543d1Sopenharmony_ci
130484543d1Sopenharmony_ci/**
131484543d1Sopenharmony_ci * @brief Set the queue max concurrency.
132484543d1Sopenharmony_ci *
133484543d1Sopenharmony_ci * @param attr Queue Property Pointer.
134484543d1Sopenharmony_ci * @param max_concurrency queue max_concurrency.
135484543d1Sopenharmony_ci * @since 12
136484543d1Sopenharmony_ci * @version 1.0
137484543d1Sopenharmony_ci */
138484543d1Sopenharmony_ciFFRT_C_API void ffrt_queue_attr_set_max_concurrency(ffrt_queue_attr_t* attr, const int max_concurrency);
139484543d1Sopenharmony_ci
140484543d1Sopenharmony_ci/**
141484543d1Sopenharmony_ci * @brief Get the queue max concurrency.
142484543d1Sopenharmony_ci *
143484543d1Sopenharmony_ci * @param attr Queue Property Pointer.
144484543d1Sopenharmony_ci * @return Returns the queue max concurrency.
145484543d1Sopenharmony_ci * @since 12
146484543d1Sopenharmony_ci * @version 1.0
147484543d1Sopenharmony_ci */
148484543d1Sopenharmony_ciFFRT_C_API int ffrt_queue_attr_get_max_concurrency(const ffrt_queue_attr_t* attr);
149484543d1Sopenharmony_ci
150484543d1Sopenharmony_ci/**
151484543d1Sopenharmony_ci * @brief Creates a queue.
152484543d1Sopenharmony_ci *
153484543d1Sopenharmony_ci * @param type Indicates the queue type.
154484543d1Sopenharmony_ci * @param name Indicates a pointer to the queue name.
155484543d1Sopenharmony_ci * @param attr Indicates a pointer to the queue attribute.
156484543d1Sopenharmony_ci * @return Returns a non-null queue handle if the queue is created;
157484543d1Sopenharmony_ci           returns a null pointer otherwise.
158484543d1Sopenharmony_ci * @since 10
159484543d1Sopenharmony_ci * @version 1.0
160484543d1Sopenharmony_ci */
161484543d1Sopenharmony_ciFFRT_C_API ffrt_queue_t ffrt_queue_create(ffrt_queue_type_t type, const char* name, const ffrt_queue_attr_t* attr);
162484543d1Sopenharmony_ci
163484543d1Sopenharmony_ci/**
164484543d1Sopenharmony_ci * @brief Destroys a queue.
165484543d1Sopenharmony_ci *
166484543d1Sopenharmony_ci * @param queue Indicates a queue handle.
167484543d1Sopenharmony_ci * @since 10
168484543d1Sopenharmony_ci * @version 1.0
169484543d1Sopenharmony_ci */
170484543d1Sopenharmony_ciFFRT_C_API void ffrt_queue_destroy(ffrt_queue_t queue);
171484543d1Sopenharmony_ci
172484543d1Sopenharmony_ci/**
173484543d1Sopenharmony_ci * @brief Submits a task to a queue.
174484543d1Sopenharmony_ci *
175484543d1Sopenharmony_ci * @param queue Indicates a queue handle.
176484543d1Sopenharmony_ci * @param f Indicates a pointer to the task executor.
177484543d1Sopenharmony_ci * @param attr Indicates a pointer to the task attribute.
178484543d1Sopenharmony_ci * @since 10
179484543d1Sopenharmony_ci * @version 1.0
180484543d1Sopenharmony_ci */
181484543d1Sopenharmony_ciFFRT_C_API void ffrt_queue_submit(ffrt_queue_t queue, ffrt_function_header_t* f, const ffrt_task_attr_t* attr);
182484543d1Sopenharmony_ci
183484543d1Sopenharmony_ci/**
184484543d1Sopenharmony_ci * @brief Submits a task to the queue, and obtains a task handle.
185484543d1Sopenharmony_ci *
186484543d1Sopenharmony_ci * @param queue Indicates a queue handle.
187484543d1Sopenharmony_ci * @param f Indicates a pointer to the task executor.
188484543d1Sopenharmony_ci * @param attr Indicates a pointer to the task attribute.
189484543d1Sopenharmony_ci * @return Returns a non-null task handle if the task is submitted;
190484543d1Sopenharmony_ci           returns a null pointer otherwise.
191484543d1Sopenharmony_ci * @since 10
192484543d1Sopenharmony_ci * @version 1.0
193484543d1Sopenharmony_ci */
194484543d1Sopenharmony_ciFFRT_C_API ffrt_task_handle_t ffrt_queue_submit_h(
195484543d1Sopenharmony_ci    ffrt_queue_t queue, ffrt_function_header_t* f, const ffrt_task_attr_t* attr);
196484543d1Sopenharmony_ci
197484543d1Sopenharmony_ci/**
198484543d1Sopenharmony_ci * @brief Waits until a task in the queue is complete.
199484543d1Sopenharmony_ci *
200484543d1Sopenharmony_ci * @param handle Indicates a task handle.
201484543d1Sopenharmony_ci * @since 10
202484543d1Sopenharmony_ci * @version 1.0
203484543d1Sopenharmony_ci */
204484543d1Sopenharmony_ciFFRT_C_API void ffrt_queue_wait(ffrt_task_handle_t handle);
205484543d1Sopenharmony_ci
206484543d1Sopenharmony_ci/**
207484543d1Sopenharmony_ci * @brief Cancels a task in the queue.
208484543d1Sopenharmony_ci *
209484543d1Sopenharmony_ci * @param handle Indicates a task handle.
210484543d1Sopenharmony_ci * @return Returns <b>0</b> if the task is canceled;
211484543d1Sopenharmony_ci           returns <b>-1</b> otherwise.
212484543d1Sopenharmony_ci * @since 10
213484543d1Sopenharmony_ci * @version 1.0
214484543d1Sopenharmony_ci */
215484543d1Sopenharmony_ciFFRT_C_API int ffrt_queue_cancel(ffrt_task_handle_t handle);
216484543d1Sopenharmony_ci
217484543d1Sopenharmony_ci/**
218484543d1Sopenharmony_ci * @brief Get application main thread queue.
219484543d1Sopenharmony_ci *
220484543d1Sopenharmony_ci * @return Returns application main thread queue.
221484543d1Sopenharmony_ci * @since 12
222484543d1Sopenharmony_ci * @version 1.0
223484543d1Sopenharmony_ci */
224484543d1Sopenharmony_ciFFRT_C_API ffrt_queue_t ffrt_get_main_queue();
225484543d1Sopenharmony_ci
226484543d1Sopenharmony_ci/**
227484543d1Sopenharmony_ci * @brief Get application worker(ArkTs) thread queue.
228484543d1Sopenharmony_ci *
229484543d1Sopenharmony_ci * @return Returns application worker(ArkTs) thread queue.
230484543d1Sopenharmony_ci * @since 12
231484543d1Sopenharmony_ci * @version 1.0
232484543d1Sopenharmony_ci */
233484543d1Sopenharmony_ciFFRT_C_API ffrt_queue_t ffrt_get_current_queue();
234484543d1Sopenharmony_ci
235484543d1Sopenharmony_ci#endif // FFRT_API_C_QUEUE_H