目录

Function Flow Runtime C APIs

Task Management

[h2]ffrt_deps_t

Declaration

typedef enum {
    ffrt_dependence_data,
    ffrt_dependence_task,
} ffrt_dependence_type_t;

typedef struct {
    ffrt_dependence_type_t type;
    const void* ptr;
} ffrt_dependence_t;

typedef struct {
    uint32_t len;
    const ffrt_dependence_t* items;
} ffrt_deps_t;

Parameters

Description

The function of ffrt_dependence_t is the same as that of dependence in C++, and the function of ffrt_deps_t is the same as that of std::vector<dependence> in C++.

Example

// Create a data dependency.
int x = 0;
ffrt_dependence_t data_dependence[1];
data_dependence[0].type = ffrt_dependence_data;
data_dependence[0].ptr = &x;
ffrt_deps_t data_deps;
data_deps.len = 1;
data_deps.items = data_dependence;

// Create a task dependency.
ffrt_task_handle_t task = ffrt_submit_h_base(user_function_header, NULL, NULL, &attr);
ffrt_dependence_t task_dependence[1];
task_dependence[0].type = ffrt_dependence_task;
task_dependence[0].ptr = task;
ffrt_deps_t task_deps;
task_deps.len = 1;
task_deps.items = task_dependence;

[h2]ffrt_task_attr_t

Declaration

typedef struct {
    uint32_t storage[(ffrt_task_attr_storage_size + sizeof(uint32_t) - 1) / sizeof(uint32_t)];
} ffrt_task_attr_t;

Description

Describes the task attribute, which can be configured using ffrt_task_attr_t when submitting a common task or queue task.

Methods

ffrt_task_attr_init

FFRT_C_API int ffrt_task_attr_init(ffrt_task_attr_t* attr);

Parameters

Return Values

Description

ffrt_task_attr_destroy

FFRT_C_API void ffrt_task_attr_destroy(ffrt_task_attr_t* attr);

Parameters

Description

ffrt_task_attr_set_name

FFRT_C_API void ffrt_task_attr_set_name(ffrt_task_attr_t* attr, const char* name);

Parameters

Description

ffrt_task_attr_get_name

FFRT_C_API const char* ffrt_task_attr_get_name(const ffrt_task_attr_t* attr);

Parameters

Return Values

Description

ffrt_task_attr_set_qos

FFRT_C_API void ffrt_task_attr_set_qos(ffrt_task_attr_t* attr, ffrt_qos_t qos);

Parameters

Description

ffrt_task_attr_get_qos

FFRT_C_API ffrt_qos_t ffrt_task_attr_get_qos(const ffrt_task_attr_t* attr);

Parameters

Return Values

Description

ffrt_task_attr_set_delay

FFRT_C_API void ffrt_task_attr_set_delay(ffrt_task_attr_t* attr, uint64_t delay_us);

Parameters

Description

ffrt_task_attr_get_delay

FFRT_C_API uint64_t ffrt_task_attr_get_delay(const ffrt_task_attr_t* attr);

Parameters

Return Values

Description

ffrt_task_attr_set_queue_priority

FFRT_C_API void ffrt_task_attr_set_queue_priority(ffrt_task_attr_t* attr, ffrt_queue_priority_t priority);

Parameters

Description

ffrt_task_attr_get_queue_priority

FFRT_C_API ffrt_queue_priority_t ffrt_task_attr_get_queue_priority(const ffrt_task_attr_t* attr);

Parameters

Return Values

Description

ffrt_task_attr_set_stack_size

FFRT_C_API void ffrt_task_attr_set_stack_size(ffrt_task_attr_t* attr, uint64_t size);

Parameters

Description

ffrt_task_attr_get_stack_size

FFRT_C_API uint64_t ffrt_task_attr_get_stack_size(const ffrt_task_attr_t* attr);

Parameters

Return Values

Description

Example

// Submit a common task. The task name is "sample_task", the QoS is background, the scheduling delay is 1 ms, and the coroutine stack size is 2 MB.
ffrt_task_attr_t attr;
ffrt_task_attr_init(&attr);
ffrt_task_attr_set_name(&attr, "sample_task");
ffrt_task_attr_set_qos(&attr, ffrt_qos_background);
ffrt_task_attr_set_delay(&attr, 1000);
ffrt_task_attr_set_stack_size(&attr, 2 * 1024 * 1024);
ffrt_submit_base(user_function_header, NULL, NULL, &attr);
ffrt_task_attr_destroy(&attr);

[h2]ffrt_alloc_auto_managed_function_storage_base

Declaration

typedef enum {
    ffrt_function_kind_general,
    ffrt_function_kind_queue,
} ffrt_function_kind_t;

typedef void(*ffrt_function_t)(void*);
typedef struct {
    ffrt_function_t exec;
    ffrt_function_t destroy;
    uint64_t reserve[2];
} ffrt_function_header_t;

FFRT_C_API void *ffrt_alloc_auto_managed_function_storage_base(ffrt_function_kind_t kind);

Parameters

Return Values

Description

Allocates memory space. The header of the memory space is in the ffrt_function_header_t structure. The return pointer can be converted into the ffrt_function_header_t* pointer. A 64-byte space is reserved after the header for customizing the space for storing input parameters or return values.

Example

[h2]ffrt_submit_base

Declaration

FFRT_C_API void ffrt_submit_base(ffrt_function_header_t* f, const ffrt_deps_t* in_deps, const ffrt_deps_t* out_deps, const ffrt_task_attr_t* attr);

Parameters

Description

Submits a common task that supports attribute settings. After the input dependency is removed, the task can be scheduled and executed. After the task is executed, the output dependency is removed.

Example

[h2]ffrt_submit_f

Declaration

FFRT_C_API void ffrt_submit_f(ffrt_function_t func, void* arg, const ffrt_deps_t* in_deps, const ffrt_deps_t* out_deps, const ffrt_task_attr_t* attr);

Parameters

Description

ffrt_submit_f is a simplified form of ffrt_submit_base. When the callback function does not need to be destroyed, the API packages the task function and its parameters into a common task structure. Then, ffrt_submit_base is called to submit the task.

This API is supported since API version 20.

Example

#include <stdio.h>
#include "ffrt/task.h"

// Function to be submitted for execution.
void OnePlusForTest(void* arg)
{
    (*static_cast<int*>(arg)) += 1;
}

int main()
{
    int a = 0;
    ffrt_submit_f(OnePlusForTest, &a, NULL, NULL, NULL);

    ffrt_wait();

    printf("a = %d\n", a);
    return 0;
}

[h2]ffrt_submit_h_base

Declaration

typedef void* ffrt_task_handle_t;

FFRT_C_API ffrt_task_handle_t ffrt_submit_h_base(ffrt_function_header_t* f, const ffrt_deps_t* in_deps, const ffrt_deps_t* out_deps, const ffrt_task_attr_t* attr);

Parameters

Return Values

Description

Compared with the ffrt_submit_base API, the return value of the task handle is added.

Example

// Submit a task and obtain the task handle.
ffrt_function_header_t* func = (ffrt_function_header_t*)ffrt_alloc_auto_managed_function_storage_base(ffrt_function_kind_general);
func->exec = foo;
func->destroy = after_foo;
ffrt_task_handle_t t = ffrt_submit_h_base(func, NULL, NULL, NULL);
// Note that ffrt_task_handle_t of the C API needs to be explicitly destroyed by calling ffrt_task_handle_destroy.
ffrt_task_handle_destroy(t);

[h2]ffrt_submit_h_f

Declaration

typedef void* ffrt_task_handle_t;

FFRT_C_API ffrt_task_handle_t ffrt_submit_h_f(ffrt_function_t func, void* arg, const ffrt_deps_t* in_deps, const ffrt_deps_t* out_deps, const ffrt_task_attr_t* attr);

Parameters

Return Values

Description

Adds the return value of the task handle compared with ffrt_submit_f.

This API is supported since API version 20.

Example

#include <stdio.h>
#include <vector>
#include "ffrt/task.h"

// Function to be submitted for execution.
void OnePlusForTest(void* arg)
{
    (*static_cast<int*>(arg)) += 1;
}

int main()
{
    int a = 0;
    ffrt_task_handle_t task = ffrt_submit_h_f(OnePlusForTest, &a, NULL, NULL, NULL);

    const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
    ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
    ffrt_wait_deps(&wait);

    printf("a = %d\n", a);
    return 0;
}

[h2]ffrt_task_handle_inc_ref

Declaration

FFRT_C_API uint32_t ffrt_task_handle_inc_ref(ffrt_task_handle_t handle);

Parameters

Return Values

Description

Increases the reference count of the corresponding task through the task handle. Each time this function is called, the reference count is incremented by one. It is used to control the task lifecycle. When the reference count is not 0, the corresponding task resources are not released. Note that ffrt_task_handle_t returned by ffrt_submit_h_base already has a reference count by default. When you use ffrt_task_handle_destroy to destroy ffrt_task_handle_t, one reference count is subtracted by default.

[h2]ffrt_task_handle_dec_ref

Declaration

FFRT_C_API uint32_t ffrt_task_handle_dec_ref(ffrt_task_handle_t handle);

Parameters

Return Values

Description

Subtracts the reference count of the task through the task handle by one each time the task handle is invoked.

[h2]ffrt_task_handle_destroy

Declaration

FFRT_C_API void ffrt_task_handle_destroy(ffrt_task_handle_t handle);

Parameters

Description

Destroys a task handle and subtracts a task reference count by default.

[h2]ffrt_wait

Declaration

FFRT_C_API void ffrt_wait(void);

Description

Waits until all tasks of the same level submitted earlier are complete.

Example

// Wait until three tasks are complete.
ffrt_submit_base(func1, NULL, NULL, NULL);
ffrt_submit_base(func2, NULL, NULL, NULL);
ffrt_submit_base(func3, NULL, NULL, NULL);
ffrt_wait();

[h2]ffrt_wait_deps

Declaration

FFRT_C_API void ffrt_wait_deps(const ffrt_deps_t* deps);

Parameters

Description

Waits until the data dependency is removed.

Example

// Build the data dependency of x.
int x = 0;
ffrt_dependence_t dependence[1];
dependence[0].type = ffrt_dependence_data;
dependence[0].ptr = &x;
ffrt_deps_t deps;
deps.len = 1;
deps.items = dependence;

// Submit a write task.
ffrt_submit_base(func, NULL, &deps, NULL);

// Wait until the data dependency of the write task is removed.
ffrt_wait_deps(&deps);

[h2]ffrt_this_task_update_qos

Declaration

FFRT_C_API int ffrt_this_task_update_qos(ffrt_qos_t qos);

Parameters

Return Values

Description

Updates the task QoS dynamically during task execution. Note that this API is used in the function closure of a task to update the QoS of the task that is being executed. If this API is invoked, the task is suspended and then resumed.

Example

// Dynamically update the QoS during the execution of a qos_background task.
ffrt::submit([]() {
    // ...
    int ret = ffrt_this_task_update_qos(ffrt_qos_user_initiated);
    // ...
}, ffrt::task_attr().qos(ffrt::qos_background));

[h2]ffrt_this_task_get_qos

Declaration

FFRT_C_API ffrt_qos_t ffrt_this_task_get_qos(void);

Return Values

Description

Obtains the QoS of the task that is being executed.

Example

// Dynamically obtain the QoS during the execution of a task.
ffrt::submit([]() {
    // ...
    // The obtained QoS is ffrt_qos_background.
    ffrt_qos_t qos = ffrt_this_task_get_qos();
    // ...
}, ffrt::task_attr().qos(ffrt::qos_background));

[h2]ffrt_this_task_get_id

Declaration

FFRT_C_API uint64_t ffrt_this_task_get_id(void);

Return Values

Description

Obtains the ID of the task that is being executed.

Example

// Dynamically obtain the task ID during task execution.
ffrt::submit([]() {
    // ...
    // Obtain the unique task ID.
    uint64_t task_id = ffrt_this_task_get_id();
    // ...
}, ffrt::task_attr().qos(ffrt::qos_background));

Task Queue

[h2]ffrt_queue_attr_t

Declaration

typedef struct {
    uint32_t storage[(ffrt_queue_attr_storage_size + sizeof(uint32_t) - 1) / sizeof(uint32_t)];
} ffrt_queue_attr_t;

Description

Configures queue attributes, such as the QoS, timeout, callback function, and maximum concurrency.

Methods

ffrt_queue_attr_init

int ffrt_queue_attr_init(ffrt_queue_attr_t* attr);

Parameters

Return Values

Description

ffrt_queue_attr_destroy

void ffrt_queue_attr_destroy(ffrt_queue_attr_t* attr);

Parameters

Description

ffrt_queue_attr_set_qos

void ffrt_queue_attr_set_qos(ffrt_queue_attr_t* attr, ffrt_qos_t qos);

Parameters

Description

ffrt_queue_attr_get_qos

ffrt_qos_t ffrt_queue_attr_get_qos(const ffrt_queue_attr_t* attr);

Parameters

Return Values

Description

ffrt_queue_attr_set_timeout

void ffrt_queue_attr_set_timeout(ffrt_queue_attr_t* attr, uint64_t timeout_us);

Parameters

Description

ffrt_queue_attr_get_timeout

uint64_t ffrt_queue_attr_get_timeout(const ffrt_queue_attr_t* attr);

Parameters

Return Values

Description

ffrt_queue_attr_set_callback

void ffrt_queue_attr_set_callback(ffrt_queue_attr_t* attr, ffrt_function_header_t* f);

Parameters

Description

ffrt_queue_attr_get_callback

ffrt_function_header_t* ffrt_queue_attr_get_callback(const ffrt_queue_attr_t* attr);

Parameters

Return Values

Description

ffrt_queue_attr_set_max_concurrency

void ffrt_queue_attr_set_max_concurrency(ffrt_queue_attr_t* attr, const int max_concurrency);

Parameters

Description

ffrt_queue_attr_get_max_concurrency

int ffrt_queue_attr_get_max_concurrency(const ffrt_queue_attr_t* attr);

Parameters

Return Values

Description

ffrt_queue_attr_set_thread_mode

void ffrt_queue_attr_set_thread_mode(ffrt_queue_attr_t* attr, bool mode);

Parameters

Description

This API is supported since API version 20.

ffrt_queue_attr_get_thread_mode

bool ffrt_queue_attr_get_thread_mode(const ffrt_queue_attr_t* attr);

Parameters

Return Values

Description

This API is supported since API version 20.

Example

#include <functional>
#include "ffrt/queue.h"
#include "ffrt/cpp/task.h"

int main()
{
    ffrt_queue_attr_t queue_attr;
    // (Mandatory) Initialize the queue attribute.
    ffrt_queue_attr_init(&queue_attr);

    ffrt_queue_attr_set_qos(&queue_attr, static_cast<int>(ffrt_qos_utility));

    ffrt_queue_attr_set_timeout(&queue_attr, 10000);

    int x = 0;
    std::function<void()>&& basicFunc = [&x]() { x += 1; };
    ffrt_function_header_t* func = ffrt_queue_attr_get_callback(&queue_attr);

    ffrt_queue_attr_set_callback(&queue_attr, ffrt::create_function_wrapper(basicFunc, ffrt_function_kind_queue));
    // Destroy the queue attribute. This is mandatory.
    ffrt_queue_attr_destroy(&queue_attr);
    return 0;
}

[h2]ffrt_queue_t

Declaration

typedef void* ffrt_queue_t;

Description

Pointer to queues. It provides a series of C APIs for submitting, canceling, and waiting queue tasks and querying the number of queuing tasks.

Methods

ffrt_queue_create

ffrt_queue_t ffrt_queue_create(ffrt_queue_type_t type, const char* name, const ffrt_queue_attr_t* attr);

Parameters

Return Values

Description

ffrt_queue_destroy

void ffrt_queue_destroy(ffrt_queue_t queue);

Parameters

Description

ffrt_queue_submit

void ffrt_queue_submit(ffrt_queue_t queue, ffrt_function_header_t* f, const ffrt_task_attr_t* attr);

Parameters

Description

ffrt_queue_submit_f

void ffrt_queue_submit_f(ffrt_queue_t queue, ffrt_function_t func, void* arg, const ffrt_task_attr_t* attr);

Parameters

Description

This API is supported since API version 20.

ffrt_queue_submit_h

ffrt_task_handle_t ffrt_queue_submit_h(ffrt_queue_t queue, ffrt_function_header_t* f, const ffrt_task_attr_t* attr);

Parameters

Return Values

Description

ffrt_queue_submit_h_f

ffrt_task_handle_t ffrt_queue_submit_h_f(ffrt_queue_t queue, ffrt_function_t func, void* arg, const ffrt_task_attr_t* attr);

Parameters

Return Values

Description

This API is supported since API version 20.

ffrt_queue_wait

void ffrt_queue_wait(ffrt_task_handle_t handle);

Parameters

Description

ffrt_queue_cancel

int ffrt_queue_cancel(ffrt_task_handle_t handle);

Parameters

Return Values

Description

ffrt_get_main_queue

ffrt_queue_t ffrt_get_main_queue();

Return Values

Description

ffrt_get_current_queue

ffrt_queue_t ffrt_get_current_queue();

Return Values

Description

Example

#include "ffrt/queue.h"
#include "ffrt/cpp/task.h"

int main()
{
    ffrt_queue_attr_t queue_attr;
    // 1. Initialize the queue attribute. This is mandatory.
    (void)ffrt_queue_attr_init(&queue_attr);

    // 2. Create a serial queue and return queue_handle.
    ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);

    int result = 0;
    std::function<void()>&& basicFunc = [&result]() { result += 1; };

    // 3. Submit a serial task.
    ffrt_queue_submit(queue_handle, ffrt::create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);

    // 4. Submit the serial task and return the task handle.
    ffrt_task_handle_t t1 = ffrt_queue_submit_h(queue_handle, ffrt::create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
    // 5. Wait until the specified task is complete.
    ffrt_queue_wait(t1);

    ffrt_task_handle_t t2 = ffrt_queue_submit_h(queue_handle, ffrt::create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
    // 6. Cancel the task with handle t2.
    ffrt_queue_cancel(t2);

    // 7. Destroy the handles t1 and t2 submitted to the serial queue task. This is mandatory.
    ffrt_task_handle_destroy(t1);
    ffrt_task_handle_destroy(t2);
    // 8. Destroy the queue attribute. This is mandatory.
    ffrt_queue_attr_destroy(&queue_attr);
    // 9. Destroy the queue handle. This is mandatory.
    ffrt_queue_destroy(queue_handle);
    return 0;
}

Synchronization Primitive

[h2]ffrt_mutexattr_t

Declaration

typedef enum {
    ffrt_error = -1,
    ffrt_success = 0,
    ffrt_error_nomem = ENOMEM,
    ffrt_error_timedout = ETIMEDOUT,
    ffrt_error_busy = EBUSY,
    ffrt_error_inval = EINVAL
} ffrt_error_t;

typedef enum {
    ffrt_mutex_normal = 0,
    ffrt_mutex_recursive = 2,
    ffrt_mutex_default = ffrt_mutex_normal
} ffrt_mutex_type;

struct ffrt_mutexattr_t;

int ffrt_mutexattr_init(ffrt_mutexattr_t* attr);
int ffrt_mutexattr_settype(ffrt_mutexattr_t* attr, int type);
int ffrt_mutexattr_gettype(ffrt_mutexattr_t* attr, int* type);
int ffrt_mutexattr_destroy(ffrt_mutexattr_t* attr);

Description

Methods

ffrt_mutexattr_init

FFRT_C_API int ffrt_mutexattr_init(ffrt_mutexattr_t* attr);

Parameters

Return Values

Description

ffrt_mutexattr_destroy

FFRT_C_API int ffrt_mutexattr_destroy(ffrt_mutexattr_t* attr);

Parameters

Return Values

Description

ffrt_mutexattr_settype

FFRT_C_API int ffrt_mutexattr_settype(ffrt_mutexattr_t* attr, int type);

Parameters

Return Values

Description

ffrt_mutexattr_gettype

FFRT_C_API int ffrt_mutexattr_gettype(ffrt_mutexattr_t* attr, int* type);

Parameters

Return Values

Description

Example

ffrt_mutexattr_t attr;
// Initialize the mutex attribute.
ffrt_mutexattr_init(&attr);
// Set a mutex.
ffrt_mutexattr_settype(&attr, ffrt_mutex_normal);
// Set a recursive lock.
ffrt_mutexattr_settype(&attr, ffrt_mutex_recursive);
// Obtain the mutex type.
int type = ffrt_mutex_default;
ffrt_mutexattr_gettype(&attr, &type);
// Destroy the mutex attribute.
ffrt_mutexattr_destroy(&attr);

[h2]ffrt_mutex_t

Declaration

struct ffrt_mutex_t;
struct ffrt_mutexattr_t;

int ffrt_mutex_init(ffrt_mutex_t* mutex, const ffrt_mutexattr_t* attr);
int ffrt_mutex_lock(ffrt_mutex_t* mutex);
int ffrt_mutex_unlock(ffrt_mutex_t* mutex);
int ffrt_mutex_trylock(ffrt_mutex_t* mutex);
int ffrt_mutex_destroy(ffrt_mutex_t* mutex);

Description

Methods

ffrt_mutex_init

FFRT_C_API int ffrt_mutex_init(ffrt_mutex_t* mutex, const ffrt_mutexattr_t* attr);

Parameters

Return Values

Description

ffrt_mutex_destroy

FFRT_C_API int ffrt_mutex_destroy(ffrt_mutex_t* mutex);

Parameters

Return Values

Description

ffrt_mutex_lock

FFRT_C_API int ffrt_mutex_lock(ffrt_mutex_t* mutex);

Parameters

Return Values

Description

ffrt_mutex_unlock

FFRT_C_API int ffrt_mutex_unlock(ffrt_mutex_t* mutex);

Parameters

Return Values

Description

ffrt_mutex_trylock

FFRT_C_API int ffrt_mutex_trylock(ffrt_mutex_t* mutex);

Parameters

Return Values

Description

Example

#include "ffrt/mutex.h"
#include "ffrt/cpp/task.h"

int main()
{
    ffrt_mutexattr_t attr;
    ffrt_mutex_t lock;
    int sum = 0;
    int type = ffrt_mutex_default;
    ffrt_mutexattr_init(&attr);
    ffrt_mutexattr_settype(&attr, ffrt_mutex_recursive);
    ffrt_mutexattr_gettype(&attr, &type);
    ffrt_mutex_init(&lock, &attr);
    ffrt::submit([&]() {
        ffrt_mutex_lock(&lock);
        ffrt_mutex_trylock(&lock);
        sum++;
        ffrt_mutex_lock(&lock);
        ffrt_mutex_trylock(&lock);
        sum++;
        ffrt_mutex_unlock(&lock);
        ffrt_mutex_unlock(&lock);
        ffrt_mutex_unlock(&lock);
        ffrt_mutex_unlock(&lock);
        }, {}, {});

    ffrt::wait();

    ffrt_mutexattr_destroy(&attr);
    ffrt_mutex_destroy(&lock);
    return 0;
}

[h2]ffrt_rwlock_t

Declaration

struct ffrt_rwlock_t;
struct ffrt_rwlockattr_t;

int ffrt_rwlock_init(ffrt_rwlock_t* rwlock, const ffrt_rwlockattr_t* attr);
int ffrt_rwlock_wrlock(ffrt_rwlock_t* rwlock);
int ffrt_rwlock_rdlock(ffrt_rwlock_t* rwlock);
int ffrt_rwlock_trywrlock(ffrt_rwlock_t* rwlock);
int ffrt_rwlock_tryrdlock(ffrt_rwlock_t* rwlock);
int ffrt_rwlock_unlock(ffrt_rwlock_t* rwlock);
int ffrt_rwlock_destroy(ffrt_rwlock_t* rwlock);

Description

Methods

ffrt_rwlock_init

FFRT_C_API int ffrt_rwlock_init(ffrt_rwlock_t* rwlock, const ffrt_rwlockattr_t* attr);

Parameters

Return Values

Description

This API is supported since API version 18.

ffrt_rwlock_wrlock

FFRT_C_API int ffrt_rwlock_wrlock(ffrt_rwlock_t* rwlock);

Parameters

Return Values

Description

This API is supported since API version 18.

ffrt_rwlock_rdlock

FFRT_C_API int ffrt_rwlock_rdlock(ffrt_rwlock_t* rwlock);

Parameters

Return Values

Description

This API is supported since API version 18.

ffrt_rwlock_trywrlock

FFRT_C_API int ffrt_rwlock_trywrlock(ffrt_rwlock_t* rwlock);

Parameters

Return Values

Description

This API is supported since API version 18.

ffrt_rwlock_tryrdlock

FFRT_C_API int ffrt_rwlock_tryrdlock(ffrt_rwlock_t* rwlock);

Parameters

Return Values

Description

This API is supported since API version 18.

ffrt_rwlock_unlock

FFRT_C_API int ffrt_rwlock_unlock(ffrt_rwlock_t* rwlock);

Parameters

Return Values

Description

This API is supported since API version 18.

ffrt_rwlock_destroy

FFRT_C_API int ffrt_rwlock_destroy(ffrt_rwlock_t* rwlock);

Parameters

Return Values

Description

This API is supported since API version 18.

Example

#include "ffrt/shared_mutex.h"
#include "ffrt/sleep.h"
#include "ffrt/cpp/task.h"

int main()
{
    ffrt_rwlock_t rwlock;
    int x = 0;
    ffrt_rwlock_init(&rwlock, nullptr);
    ffrt::submit([&]() {
        ffrt_rwlock_wrlock(&rwlock);
        ffrt_usleep(10);
        x++;
        ffrt_rwlock_unlock(&rwlock);
    },{},{});

    ffrt::submit([&]() {
        ffrt_usleep(2);
        ffrt_rwlock_rdlock(&rwlock);
        ffrt_rwlock_unlock(&rwlock);
    },{},{});

    ffrt::submit([&]() {
        ffrt_usleep(2);
        if(ffrt_rwlock_trywrlock(&rwlock) == ffrt_success){
            x++;
            ffrt_rwlock_unlock(&rwlock);
        }
    },{},{});

    ffrt::submit([&]() {
        ffrt_usleep(2);
        if(ffrt_rwlock_tryrdlock(&rwlock) == ffrt_success){
            ffrt_rwlock_unlock(&rwlock);
        }
    },{},{});

    ffrt::wait();

    ffrt_rwlock_destroy(&rwlock);
    return 0;
}

[h2]ffrt_cond_t

Declaration

typedef enum {
    ffrt_error = -1,
    ffrt_success = 0,
    ffrt_error_nomem = ENOMEM,
    ffrt_error_timedout = ETIMEDOUT,
    ffrt_error_busy = EBUSY,
    ffrt_error_inval = EINVAL
} ffrt_error_t;

typedef struct {
    uint32_t storage[(ffrt_cond_storage_size + sizeof(uint32_t) - 1) / sizeof(uint32_t)];
} ffrt_cond_t;

int ffrt_cond_init(ffrt_cond_t* cond, const ffrt_condattr_t* attr);
int ffrt_cond_signal(ffrt_cond_t* cond);
int ffrt_cond_broadcast(ffrt_cond_t* cond);
int ffrt_cond_wait(ffrt_cond_t*cond, ffrt_mutex_t* mutex);
int ffrt_cond_timedwait(ffrt_cond_t* cond, ffrt_mutex_t* mutex, const struct timespec* time_point);
int ffrt_cond_destroy(ffrt_cond_t* cond);

Description

Methods

ffrt_cond_init

FFRT_C_API int ffrt_cond_init(ffrt_cond_t* cond, const ffrt_condattr_t* attr);

Parameters

Return Values

Description

ffrt_cond_destroy

FFRT_C_API int ffrt_cond_destroy(ffrt_cond_t* cond);

Parameters

Return Values

Description

ffrt_cond_signal

FFRT_C_API int ffrt_cond_signal(ffrt_cond_t* cond);

Parameters

Return Values

Description

ffrt_cond_broadcast

FFRT_C_API int ffrt_cond_broadcast(ffrt_cond_t* cond);

Parameters

Return Values

Description

ffrt_cond_wait

FFRT_C_API int ffrt_cond_wait(ffrt_cond_t* cond, ffrt_mutex_t* mutex);

Parameters

Return Values

Description

ffrt_cond_timedwait

FFRT_C_API int ffrt_cond_timedwait(ffrt_cond_t* cond, ffrt_mutex_t* mutex, const struct timespec* time_point);

Parameters

Return Values

Description

Example

#include <iostream>
#include "ffrt/condition_variable.h"
#include "ffrt/mutex.h"
#include "ffrt/sleep.h"
#include "ffrt/cpp/task.h"

struct timespec timeoutms_to_tm(int timeout_ms) {
    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);
    ts.tv_sec += timeout_ms / 1000;
    ts.tv_nsec += (timeout_ms % 1000) * 1000000;
    if (ts.tv_nsec >= 1000000000) {
        ts.tv_sec += 1;
        ts.tv_nsec -= 1000000000;
    }
    return ts;
}

int main()
{
    int a = 0;
    ffrt_cond_t cond;
    ffrt_mutex_t lock_;
    ffrt_cond_init(&cond, nullptr);
    ffrt_mutex_init(&lock_, nullptr);

    for (int i = 0; i < 3; i++) {
        ffrt::submit([&]() {
            int timeout = 2000;
            struct timespec tm = timeoutms_to_tm(timeout);
            ffrt_mutex_lock(&lock_);
            auto start = std::chrono::high_resolution_clock::now();
            ffrt_cond_timedwait(&cond, &lock_, &tm);
            auto end = std::chrono::high_resolution_clock::now();
            a = 123;
            ffrt_mutex_unlock(&lock_);
            std::chrono::duration<double, std::milli> elapsed = end - start;
            double t = elapsed.count();
            std::cout << "ffrt_cond_timedwait " << t << " ms" << std::endl;
            }, {}, {});
    }

    ffrt::submit([&]() {
        ffrt_usleep(1000 * 1000);
        ffrt_mutex_lock(&lock_);
        a = 5;
        ffrt_cond_broadcast(&cond);
        ffrt_mutex_unlock(&lock_);
        }, {}, {});
    ffrt::wait();
    ffrt_cond_destroy(&cond);
    ffrt_mutex_destroy(&lock_);
    return 0;
}

Blocking Primitive

[h2]ffrt_usleep

Declaration

FFRT_C_API int ffrt_usleep(uint64_t usec);

Parameters

Description

Example

#include "ffrt/sleep.h"
#include "ffrt/cpp/task.h"

int main()
{
    ffrt::submit([=]() { ffrt_usleep(10); }, {}, {});
    ffrt::wait();
    return 0;
}

Cooperative Primitive

[h2]ffrt_yield

Declaration

FFRT_C_API void ffrt_yield();

Description

Example

#include <iostream>
#include "ffrt/sleep.h"
#include "ffrt/cpp/task.h"

int main()
{
    int count = 12;
    for (int i = 0; i < count; i++) {
        ffrt::submit([&]() {
            ffrt_usleep(100);
            std::cout << "test" << std::endl;
            ffrt_yield();
        }, {}, {});
    }
    ffrt::wait();
    return 0;
}

Timer

[h2]ffrt_timer_t

Declaration

typedef int ffrt_timer_t;
typedef void (*ffrt_timer_cb)(void* data);

Description

Provides timer-related functions.

Methods

ffrt_timer_start

Declaration

FFRT_C_API ffrt_timer_t ffrt_timer_start(ffrt_qos_t qos, uint64_t timeout, void* data, ffrt_timer_cb cb, bool repeat);

Parameters

Return Values

Description

ffrt_timer_stop

Declaration

FFRT_C_API int ffrt_timer_stop(ffrt_qos_t qos, ffrt_timer_t handle);

Parameters

Return Values

Description

Example

Loop

[h2]ffrt_loop_t

Declaration

typedef void* ffrt_loop_t;

Description

Provides loop-related functions.

Methods

ffrt_loop_create

Declaration

FFRT_C_API ffrt_loop_t ffrt_loop_create(ffrt_queue_t queue);

Parameters

Return Values

Description

ffrt_loop_destroy

Declaration

FFRT_C_API int ffrt_loop_destroy(ffrt_loop_t loop);

Parameters

Return Values

Description

ffrt_loop_run

Declaration

FFRT_C_API int ffrt_loop_run(ffrt_loop_t loop);

Parameters

Return Values

Description

ffrt_loop_stop

Declaration

FFRT_C_API void ffrt_loop_stop(ffrt_loop_t loop);

Parameters

Description

ffrt_loop_epoll_ctl

Declaration

int ffrt_loop_epoll_ctl(ffrt_loop_t loop, int op, int fd, uint32_t events, void *data, ffrt_poller_cb cb)

Parameters

Return Values

Description

ffrt_loop_timer_start

Declaration

FFRT_C_API ffrt_timer_t ffrt_loop_timer_start(ffrt_loop_t loop, uint64_t timeout, void* data, ffrt_timer_cb cb, bool repeat);

Parameters

Return Values

Description

ffrt_loop_timer_stop

Declaration

FFRT_C_API int ffrt_loop_timer_stop(ffrt_loop_t loop, ffrt_timer_t handle);

Parameters

Return Values

Description

Example

Fiber

[h2]ffrt_fiber_t

Declaration

struct ffrt_fiber_t;

Description

Methods

ffrt_fiber_init

Declaration

FFRT_C_API int ffrt_fiber_init(ffrt_fiber_t* fiber, void(*func)(void*), void* arg, void* stack, size_t stack_size);

Parameters

Return Values

Description

This API is supported since API version 20.

ffrt_fiber_switch

Declaration

FFRT_C_API void ffrt_fiber_switch(ffrt_fiber_t* from, ffrt_fiber_t* to);

Parameters

Description

This API is supported since API version 20.