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

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