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  * @addtogroup Ffrt
18  * @{
19  *
20  * @brief ffrt provides APIs.
21  *
22  *
23  * @syscap SystemCapability.Resourceschedule.Ffrt.Core
24  *
25  * @since 10
26  */
27 
28  /**
29  * @file type_def.h
30  *
31  * @brief Declares common types.
32  *
33  * @syscap SystemCapability.Resourceschedule.Ffrt.Core
34  * @since 10
35  * @version 1.0
36  */
37 #ifndef FFRT_API_C_TYPE_DEF_H
38 #define FFRT_API_C_TYPE_DEF_H
39 #include <stdint.h>
40 #include <errno.h>
41 
42 #ifdef __cplusplus
43 #define FFRT_C_API  extern "C"
44 #else
45 #define FFRT_C_API
46 #endif
47 
48 /**
49  * @brief Enumerates the task priority types.
50  *
51  */
52 typedef enum {
53     /** should be distributed at once if possible, handle time equals to send time, prior to high level */
54     ffrt_queue_priority_immediate,
55     /** high priority, sorted by handle time, prior to low level. */
56     ffrt_queue_priority_high,
57     /** low priority, sorted by handle time, prior to idle level. */
58     ffrt_queue_priority_low,
59     /** lowest priority, sorted by handle time, only distribute when there is no other level inside queue. */
60     ffrt_queue_priority_idle,
61 } ffrt_queue_priority_t;
62 
63 /**
64  * @brief Enumerates the task QoS types.
65  *
66  */
67 typedef enum {
68     /** Inheritance. */
69     ffrt_qos_inherit = -1,
70     /** Background task. */
71     ffrt_qos_background,
72     /** Real-time tool. */
73     ffrt_qos_utility,
74     /** Default type. */
75     ffrt_qos_default,
76     /** User initiated. */
77     ffrt_qos_user_initiated,
78 } ffrt_qos_default_t;
79 typedef int ffrt_qos_t;
80 
81 typedef void(*ffrt_function_t)(void*);
82 
83 /**
84  * @brief Defines a task executor.
85  *
86  */
87 typedef struct {
88     /** Function used to execute a task. */
89     ffrt_function_t exec;
90     /** Function used to destroy a task. */
91     ffrt_function_t destroy;
92     /** Need to be set to 0. */
93     uint64_t reserve[2];
94 } ffrt_function_header_t;
95 
96 /**
97  * @brief Defines the storage size of multiple types of structs.
98  *
99  */
100 typedef enum {
101     /** Task attribute storage size. */
102     ffrt_task_attr_storage_size = 128,
103     /** Task executor storage size. */
104     ffrt_auto_managed_function_storage_size = 64 + sizeof(ffrt_function_header_t),
105     /* Mutex storage size. */
106     ffrt_mutex_storage_size = 64,
107     /** Condition variable storage size. */
108     ffrt_cond_storage_size = 64,
109     /** Queue storage size. */
110     ffrt_queue_attr_storage_size = 128,
111 } ffrt_storage_size_t;
112 
113 /**
114  * @brief Enumerates the task types.
115  *
116  */
117 typedef enum {
118     /** General task. */
119     ffrt_function_kind_general,
120     /** Queue task. */
121     ffrt_function_kind_queue,
122 } ffrt_function_kind_t;
123 
124 /**
125  * @brief dependency type.
126  *
127  */
128 typedef enum {
129     /** Data dependency type. */
130     ffrt_dependence_data,
131     /** Task dependency type. */
132     ffrt_dependence_task,
133 } ffrt_dependence_type_t;
134 
135 /**
136  * @brief dependency data structure.
137  *
138  */
139 typedef struct {
140     /** Dependency type. */
141     ffrt_dependence_type_t type;
142     /** Dependency pointer. */
143     const void* ptr;
144 } ffrt_dependence_t;
145 
146 /**
147  * @brief Defines the dependency struct.
148  *
149  */
150 typedef struct {
151     /** Number of dependencies. */
152     uint32_t len;
153     /** Dependent data. */
154     const ffrt_dependence_t* items;
155 } ffrt_deps_t;
156 
157 typedef struct {
158     uint32_t storage[(ffrt_task_attr_storage_size + sizeof(uint32_t) - 1) / sizeof(uint32_t)];
159 } ffrt_task_attr_t;
160 
161 typedef struct {
162     uint32_t storage[(ffrt_queue_attr_storage_size + sizeof(uint32_t) - 1) / sizeof(uint32_t)];
163 } ffrt_queue_attr_t;
164 
165 typedef void* ffrt_task_handle_t;
166 
167 typedef enum {
168     ffrt_error = -1,
169     ffrt_success = 0,
170     ffrt_error_nomem = ENOMEM,
171     ffrt_error_timedout = ETIMEDOUT,
172     ffrt_error_busy = EBUSY,
173     ffrt_error_inval = EINVAL
174 } ffrt_error_t;
175 
176 typedef struct {
177     long storage;
178 } ffrt_condattr_t;
179 
180 typedef struct {
181     long storage;
182 } ffrt_mutexattr_t;
183 
184 /**
185  * @brief ffrt mutex type enum
186  *
187  * Describes the mutex type, ffrt_mutex_normal is normal mutex;
188  * ffrt_mutex_recursive is recursive mutex, ffrt_mutex_default is normal mutex.
189  *
190  * @since 12
191  */
192 typedef enum {
193     /** ffrt normal mutex type */
194     ffrt_mutex_normal = 0,
195     /** ffrt recursive mutex type */
196     ffrt_mutex_recursive = 2,
197     /** ffrt default mutex type */
198     ffrt_mutex_default = ffrt_mutex_normal
199 } ffrt_mutex_type;
200 
201 typedef struct {
202     uint32_t storage[(ffrt_mutex_storage_size + sizeof(uint32_t) - 1) / sizeof(uint32_t)];
203 } ffrt_mutex_t;
204 
205 typedef struct {
206     uint32_t storage[(ffrt_cond_storage_size + sizeof(uint32_t) - 1) / sizeof(uint32_t)];
207 } ffrt_cond_t;
208 
209 typedef void (*ffrt_poller_cb)(void* data, uint32_t event);
210 
211 typedef void (*ffrt_timer_cb)(void* data);
212 
213 typedef int ffrt_timer_t;
214 
215 
216 #ifdef __cplusplus
217 namespace ffrt {
218 enum qos_default {
219     qos_inherit = ffrt_qos_inherit,
220     qos_background = ffrt_qos_background,
221     qos_utility = ffrt_qos_utility,
222     qos_default = ffrt_qos_default,
223     qos_user_initiated = ffrt_qos_user_initiated,
224 };
225 using qos = int;
226 
227 }
228 #endif
229 #endif
230