34 lines
3.2 KiB
C
34 lines
3.2 KiB
C
/* Единственный дисковый поток модуля. submit/done выполняются в uasync, work —
|
|
* в pthread. Очередь ограничена; completion резервируется до передачи работы.
|
|
* Для обязательной очистки reserve выполняется до открытия файлов. destroy в uasync
|
|
* ждёт работ и доставляет done, включая поставленные ими cleanup jobs; допустим из внешней команды.
|
|
* Отмена completion удаляет task и из общей очереди, и из ещё не исполненной части batch uasync.
|
|
* data/arg заимствованы до done; worker освобождает только собственную оболочку работы.
|
|
* ua/work/done и worker обязательны; ua живёт до конца destroy. Останавливать worker из done нельзя. */
|
|
#ifndef MEMBER_FILES_WORKER_H
|
|
#define MEMBER_FILES_WORKER_H
|
|
struct UASYNC;
|
|
struct mf_worker;
|
|
struct mf_work;
|
|
typedef void (*mf_work_fn)(void* arg);
|
|
/* error=0 — work завершён, результат операции находится в data; -1 — обычная задача не принята (синхронно). */
|
|
typedef void (*mf_done_fn)(void* arg, int error);
|
|
/* Создать pthread/mutex/condition; возвращает owner либо NULL, без дискового I/O. */
|
|
struct mf_worker* mf_worker_create(struct UASYNC* ua);
|
|
/* Резерв оболочки и completion, NULL при OOM. Сам по себе не занимает очередь/не задаёт worker. */
|
|
struct mf_work* mf_worker_reserve(void);
|
|
/* Освободить только ещё не переданный в submit_reserved резерв; NULL допустим. */
|
|
void mf_worker_unreserve(struct mf_work* work);
|
|
/* До64 обычных задач, включая ожидающие done. При отказе done(-1) синхронно, work не вызывается. */
|
|
void mf_worker_submit(struct mf_worker* worker, mf_work_fn work, void* data, mf_done_fn done, void* arg);
|
|
/* Передать резерв worker без проверки лимита64: только обязательные cleanup continuations.
|
|
* После вызова резерв нельзя освобождать/использовать повторно. Work выполняется FIFO, done ровно один раз. */
|
|
void mf_worker_submit_reserved(struct mf_worker* worker, struct mf_work* reserved,
|
|
mf_work_fn work, void* data, mf_done_fn done, void* arg);
|
|
// После quiesce владельца в uasync, вне собственных done: дождаться работ и cleanup continuations, не останавливая pthread.
|
|
// Не запускает uasync рекурсивно; порядок done при drain не обещается. NULL допустим.
|
|
void mf_worker_drain(struct mf_worker* worker);
|
|
/* Drain, затем join и освобождение. Работы не прерываются и получают обычный done(0); NULL допустим. */
|
|
void mf_worker_destroy(struct mf_worker* worker);
|
|
#endif
|