1cac7dca0Sopenharmony_ci// Copyright (c) 2023 Huawei Device Co., Ltd. 2cac7dca0Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 3cac7dca0Sopenharmony_ci// you may not use this file except in compliance with the License. 4cac7dca0Sopenharmony_ci// You may obtain a copy of the License at 5cac7dca0Sopenharmony_ci// 6cac7dca0Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 7cac7dca0Sopenharmony_ci// 8cac7dca0Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 9cac7dca0Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 10cac7dca0Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11cac7dca0Sopenharmony_ci// See the License for the specific language governing permissions and 12cac7dca0Sopenharmony_ci// limitations under the License. 13cac7dca0Sopenharmony_ci 14cac7dca0Sopenharmony_ciuse std::ffi::{CStr, CString}; 15cac7dca0Sopenharmony_ci 16cac7dca0Sopenharmony_ciuse libc::{c_char, c_void}; 17cac7dca0Sopenharmony_ci 18cac7dca0Sopenharmony_ciuse super::*; 19cac7dca0Sopenharmony_ci 20cac7dca0Sopenharmony_citype FfrtHook = extern "C" fn(*mut c_void); 21cac7dca0Sopenharmony_ci 22cac7dca0Sopenharmony_citype FfrtExecHook = extern "C" fn(*mut c_void) -> FfrtRet; 23cac7dca0Sopenharmony_ci 24cac7dca0Sopenharmony_citype RawTaskCtx = *mut c_void; 25cac7dca0Sopenharmony_ci 26cac7dca0Sopenharmony_ci/// Return value. 27cac7dca0Sopenharmony_ci#[repr(C)] 28cac7dca0Sopenharmony_cipub enum FfrtRet { 29cac7dca0Sopenharmony_ci /// Asynchronous task result pending. 30cac7dca0Sopenharmony_ci FfrtCoroutinePending, 31cac7dca0Sopenharmony_ci /// Asynchronous task result is ready. 32cac7dca0Sopenharmony_ci FfrtCoroutineReady, 33cac7dca0Sopenharmony_ci} 34cac7dca0Sopenharmony_ci 35cac7dca0Sopenharmony_ciimpl Default for FfrtTaskAttr { 36cac7dca0Sopenharmony_ci fn default() -> Self { 37cac7dca0Sopenharmony_ci Self::new() 38cac7dca0Sopenharmony_ci } 39cac7dca0Sopenharmony_ci} 40cac7dca0Sopenharmony_ci 41cac7dca0Sopenharmony_ciimpl FfrtTaskAttr { 42cac7dca0Sopenharmony_ci /// Creates a default task attribute. 43cac7dca0Sopenharmony_ci pub fn new() -> Self { 44cac7dca0Sopenharmony_ci Self { storage: [0; 128] } 45cac7dca0Sopenharmony_ci } 46cac7dca0Sopenharmony_ci 47cac7dca0Sopenharmony_ci /// Initializes the task attribute 48cac7dca0Sopenharmony_ci pub fn init(&mut self) { 49cac7dca0Sopenharmony_ci let attr = self as *mut FfrtTaskAttr; 50cac7dca0Sopenharmony_ci unsafe { 51cac7dca0Sopenharmony_ci ffrt_task_attr_init(attr); 52cac7dca0Sopenharmony_ci } 53cac7dca0Sopenharmony_ci } 54cac7dca0Sopenharmony_ci 55cac7dca0Sopenharmony_ci /// Sets the name for the task attribute. 56cac7dca0Sopenharmony_ci pub fn set_name(&mut self, name: &str) -> &mut Self { 57cac7dca0Sopenharmony_ci let attr_ptr = self as *mut FfrtTaskAttr; 58cac7dca0Sopenharmony_ci let c_name = CString::new(name).expect("FfrtTaskAttr::set_name failed"); 59cac7dca0Sopenharmony_ci unsafe { 60cac7dca0Sopenharmony_ci ffrt_task_attr_set_name(attr_ptr, c_name.as_ptr()); 61cac7dca0Sopenharmony_ci } 62cac7dca0Sopenharmony_ci self 63cac7dca0Sopenharmony_ci } 64cac7dca0Sopenharmony_ci 65cac7dca0Sopenharmony_ci /// Gets the name from the task attribtue. 66cac7dca0Sopenharmony_ci pub fn get_name(&self) -> String { 67cac7dca0Sopenharmony_ci let attr_ptr = self as *const FfrtTaskAttr; 68cac7dca0Sopenharmony_ci unsafe { 69cac7dca0Sopenharmony_ci let c_name = ffrt_task_attr_get_name(attr_ptr); 70cac7dca0Sopenharmony_ci CStr::from_ptr(c_name) 71cac7dca0Sopenharmony_ci .to_str() 72cac7dca0Sopenharmony_ci .expect("FfrtTaskAttr::get_name failed") 73cac7dca0Sopenharmony_ci .to_string() 74cac7dca0Sopenharmony_ci } 75cac7dca0Sopenharmony_ci } 76cac7dca0Sopenharmony_ci 77cac7dca0Sopenharmony_ci /// Sets qos level for the task attribute. 78cac7dca0Sopenharmony_ci pub fn set_qos(&mut self, qos: Qos) -> &mut Self { 79cac7dca0Sopenharmony_ci unsafe { 80cac7dca0Sopenharmony_ci let ptr = self as *mut FfrtTaskAttr; 81cac7dca0Sopenharmony_ci ffrt_task_attr_set_qos(ptr, qos); 82cac7dca0Sopenharmony_ci } 83cac7dca0Sopenharmony_ci self 84cac7dca0Sopenharmony_ci } 85cac7dca0Sopenharmony_ci 86cac7dca0Sopenharmony_ci /// Gets the qos level from the task attribute. 87cac7dca0Sopenharmony_ci pub fn get_qos(&self) -> Qos { 88cac7dca0Sopenharmony_ci unsafe { ffrt_task_attr_get_qos(self as _) } 89cac7dca0Sopenharmony_ci } 90cac7dca0Sopenharmony_ci} 91cac7dca0Sopenharmony_ci 92cac7dca0Sopenharmony_ciimpl Drop for FfrtTaskAttr { 93cac7dca0Sopenharmony_ci fn drop(&mut self) { 94cac7dca0Sopenharmony_ci unsafe { 95cac7dca0Sopenharmony_ci ffrt_task_attr_destroy(self as _); 96cac7dca0Sopenharmony_ci } 97cac7dca0Sopenharmony_ci } 98cac7dca0Sopenharmony_ci} 99cac7dca0Sopenharmony_ci 100cac7dca0Sopenharmony_ci#[link(name = "ffrt")] 101cac7dca0Sopenharmony_ci// task.h 102cac7dca0Sopenharmony_ciextern "C" { 103cac7dca0Sopenharmony_ci #![allow(unused)] 104cac7dca0Sopenharmony_ci 105cac7dca0Sopenharmony_ci fn ffrt_task_attr_init(attr: *mut FfrtTaskAttr); 106cac7dca0Sopenharmony_ci fn ffrt_task_attr_set_name(attr: *mut FfrtTaskAttr, name: *const c_char); 107cac7dca0Sopenharmony_ci fn ffrt_task_attr_get_name(attr: *const FfrtTaskAttr) -> *const c_char; 108cac7dca0Sopenharmony_ci fn ffrt_task_attr_destroy(attr: *mut FfrtTaskAttr); 109cac7dca0Sopenharmony_ci fn ffrt_task_attr_set_qos(attr: *mut FfrtTaskAttr, qos: Qos); 110cac7dca0Sopenharmony_ci fn ffrt_task_attr_get_qos(attr: *const FfrtTaskAttr) -> Qos; 111cac7dca0Sopenharmony_ci 112cac7dca0Sopenharmony_ci // submit 113cac7dca0Sopenharmony_ci fn ffrt_alloc_auto_free_function_storage_base() -> *const c_void; 114cac7dca0Sopenharmony_ci 115cac7dca0Sopenharmony_ci /// Submits a task. 116cac7dca0Sopenharmony_ci pub fn ffrt_submit_coroutine( 117cac7dca0Sopenharmony_ci // void* callable 118cac7dca0Sopenharmony_ci data: *mut c_void, 119cac7dca0Sopenharmony_ci // ffrt_function_tdd exec 120cac7dca0Sopenharmony_ci fp: FfrtExecHook, 121cac7dca0Sopenharmony_ci // ffrt_function_t destroy 122cac7dca0Sopenharmony_ci destroy_fp: FfrtHook, 123cac7dca0Sopenharmony_ci // const ffrt_deps_t* out_deps, 124cac7dca0Sopenharmony_ci in_deps: *const FfrtDeps, 125cac7dca0Sopenharmony_ci // const ffrt_deps_t* out_deps, 126cac7dca0Sopenharmony_ci out_deps: *const FfrtDeps, 127cac7dca0Sopenharmony_ci // const ffrt_task_attr_t* att 128cac7dca0Sopenharmony_ci attr: *const FfrtTaskAttr, 129cac7dca0Sopenharmony_ci ); 130cac7dca0Sopenharmony_ci 131cac7dca0Sopenharmony_ci /// Gets the current task context. 132cac7dca0Sopenharmony_ci pub fn ffrt_get_current_task() -> RawTaskCtx; 133cac7dca0Sopenharmony_ci 134cac7dca0Sopenharmony_ci /// Wakes the task 135cac7dca0Sopenharmony_ci pub fn ffrt_wake_coroutine(task: RawTaskCtx); 136cac7dca0Sopenharmony_ci} 137