/* 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 #include 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