54 lines
2.9 KiB
C
54 lines
2.9 KiB
C
/* 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)
|
|
/* Вызывать вне callbacks uasync. Ждёт работы, отменяет posted completion,
|
|
* вызывает ожидающие done и освобождает ma; NULL допустим. */
|
|
void media_async_destroy(struct media_async* ma);
|
|
|
|
/* Передать задачу (не более 16 активных); 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
|