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