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