You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
2.8 KiB
52 lines
2.8 KiB
/* media_async — владелец фоновых задач обработки файлов и криптографии. |
|
* Каждая work выполняется в отдельном pthread; done — в потоке uasync. |
|
* create/submit/destroy вызываются из этого потока. destroy ждёт workers и |
|
* завершает ожидающие done с CANCELLED, пока данные вызывающего ещё существуют. */ |
|
#ifndef MEDIA_ASYNC_H |
|
#define MEDIA_ASYNC_H |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
#include <stdint.h> |
|
#include <stddef.h> |
|
|
|
struct UASYNC; |
|
|
|
struct media_async; |
|
|
|
typedef void (*ma_work_fn)(void* data); // рабочий поток; не обращаться к состоянию uasync |
|
typedef void (*ma_done_fn)(void* arg, int err); // 0=work завершён, -1=ошибка запуска/таймера, -2=отмена |
|
|
|
/* Создать владельца задач; NULL при ошибке выделения памяти. */ |
|
struct media_async* media_async_create(void); |
|
#define MEDIA_ASYNC_CANCELLED (-2) |
|
/* Вызывать вне done. Ждёт работы, вызывает ожидающие done и освобождает ma; NULL допустим. */ |
|
void media_async_destroy(struct media_async* ma); |
|
|
|
/* Передать задачу; data/arg остаются у вызывающего до done. При ошибке done |
|
* может быть вызван синхронно. Ошибку самой work передают через data, а не err. */ |
|
void media_async_submit(struct media_async* ma, struct UASYNC* ua, |
|
ma_work_fn work, void* data, |
|
ma_done_fn done, void* arg); |
|
|
|
/* Синхронные примитивы для worker: SHA256 файла, Ed25519-подпись, копирование. 0/-1. */ |
|
int ma_sha256_file(const char* path, uint8_t hash_out[32]); |
|
int ma_sign_block(const uint8_t* ed25519_privkey, |
|
const uint8_t* data, size_t len, uint8_t sig_out[64]); |
|
int ma_copy_file(const char* src, const char* dst); |
|
/* Размер файла в байтах (int; для файлов, помещающихся в этот тип), -1 при ошибке stat. */ |
|
int ma_file_size(const char* path); |
|
/* Заполнить 16 случайных байт идентификатора. */ |
|
void ma_uuid(uint8_t uuid_out[16]); |
|
|
|
/* Рекурсивный обход каталога: для каждого regular-файла вызывается cb(full_path, size). |
|
* Пути строятся с '/' (принимается и POSIX, и Win32 API). 0 = ok, -1 = неверные аргументы. */ |
|
typedef void (*ma_dir_walk_cb)(void* arg, const char* full_path, int64_t size); |
|
int ma_dir_walk(const char* dir, ma_dir_walk_cb cb, void* arg); |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
#endif
|
|
|