/* SPDX-License-Identifier: GPL-2.0+ OR MIT */
#ifndef __EROFS_WORKQUEUE_H
#define __EROFS_WORKQUEUE_H

#include "internal.h"

struct erofs_workqueue;

typedef void *(*erofs_wq_func_t)(struct erofs_workqueue *, void *);

struct erofs_work {
	struct erofs_work *next;
	void (*fn)(struct erofs_work *work, void *tlsp);
};

struct erofs_workqueue {
	struct erofs_work *head, *tail;
	pthread_mutex_t lock;
	pthread_cond_t cond_empty;
	pthread_cond_t cond_full;
	pthread_t *workers;
	unsigned int nworker;
	unsigned int max_jobs;
	unsigned int job_count;
	bool shutdown;
	erofs_wq_func_t on_start, on_exit;
};

int erofs_alloc_workqueue(struct erofs_workqueue *wq, unsigned int nworker,
			  unsigned int max_jobs, erofs_wq_func_t on_start,
			  erofs_wq_func_t on_exit);
int erofs_queue_work(struct erofs_workqueue *wq, struct erofs_work *work);
int erofs_destroy_workqueue(struct erofs_workqueue *wq);
#endif
