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