/
catompiler
/
slcan
Обзор
Документация
Войти
/
catompiler
/
slcan
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
slcan_future.h
147 строк
4 KB
Artem Tyanutov
slcan master flush
16 ноя 2024, 18:18
16 ноя 2024, 18:18
398ba51
Код
Авторство
О чём код?
#ifndef SLCAN_FUTURE_H_ #define SLCAN_FUTURE_H_ #include <stdbool.h> #include <stddef.h> #include "slcan_defs.h" #include "slcan_err.h" //! Преобразует значение к результату будущего. #define SLCAN_FUTURE_RESULT(RES) ((void*)(ptrdiff_t)(RES)) //! Преобразует результат будущего в прочие типы. #define SLCAN_FUTURE_RESULT_CAST(T, RES) ((T)(RES)) #define SLCAN_FUTURE_RESULT_CAST_LONG(RES) SLCAN_FUTURE_RESULT_CAST(long, (RES)) #define SLCAN_FUTURE_RESULT_CAST_ULONG(RES) SLCAN_FUTURE_RESULT_CAST(unsigned long, (RES)) //! Преобразует результат будущего в int. #define SLCAN_FUTURE_RESULT_INT(RES) ((int)SLCAN_FUTURE_RESULT_CAST_LONG(RES)) //! Преобразует результат будущего в unsigned int. #define SLCAN_FUTURE_RESULT_UINT(RES) ((unsigned int)SLCAN_FUTURE_RESULT_CAST_ULONG(RES)) //! Преобразует результат будущего в slcan_err_t. #define SLCAN_FUTURE_RESULT_ERR(RES) ((slcan_err_t)SLCAN_FUTURE_RESULT_CAST(ptrdiff_t, RES)) /** * Структура будущего. */ typedef struct _Slcan_Future { //! Результат. void * volatile result; //! Флаг окончания. volatile bool done; //! Флаг выполнения. volatile bool running; } slcan_future_t; /** * Инициализирует будущее. * Незавершённое, невыполняющееся, с нулевым результатом. * @param future Будущее. */ ALWAYS_INLINE static void slcan_future_init(slcan_future_t* future) { future->result = NULL; future->done = false; future->running = false; } /** * Получает результат будущего. * @param future Будущее. * @return Результат. */ ALWAYS_INLINE static void* slcan_future_result(const slcan_future_t* future) { return future->result; } /** * Устанавливает результат. * @param future Будущее. * @param result Результат. */ ALWAYS_INLINE static void slcan_future_set_result(slcan_future_t* future, void* result) { future->result = result; } /** * Получает флаг завершения. * @param future Будущее. * @return Флаг завершения. */ ALWAYS_INLINE static bool slcan_future_done(const slcan_future_t* future) { return future->done; } /** * Устанавливает флаг завершения. * @param future Будущее. * @param done Флаг завершения. */ ALWAYS_INLINE static void slcan_future_set_done(slcan_future_t* future, bool done) { future->done = done; } /** * Получает флаг выполнения. * @param future Будущее. * @return Флаг выполнения. */ ALWAYS_INLINE static bool slcan_future_running(const slcan_future_t* future) { return future->running; } /** * Устанавливает флаг выполнения. * @param future Будущее. * @param running Флаг выполнения. */ ALWAYS_INLINE static void slcan_future_set_running(slcan_future_t* future, bool running) { future->running = running; } /** * Запускает выполнение будущего (done = false; running = true;). * @param future Будущее. */ ALWAYS_INLINE static void slcan_future_start(slcan_future_t* future) { future->done = false; future->running = true; } /** * Завершает выполнение будущего (done = true; running = false;). * @param future Будущее. * @param result Результат. */ ALWAYS_INLINE static void slcan_future_finish(slcan_future_t* future, void* result) { future->done = true; future->running = false; future->result = result; } /** * Ждёт окончания выполнения будущего. * @param future Будущее. */ ALWAYS_INLINE static void slcan_future_wait(const slcan_future_t* future) { for(;;){ if(!slcan_future_running(future)) break; } } #endif /* SLCAN_FUTURE_H_ */