#ifndef KERNEL_WORK_H_ #define KERNEL_WORK_H_ #include #include #include struct work_item; typedef void (*work_func_t)(struct work_item *); struct work_item { void *w_data; work_func_t w_func; struct queue_entry w_head; }; struct worker_pool { struct thread **wp_workers; size_t wp_nworkers; }; struct workqueue { spin_lock_t wq_lock; struct queue wq_queue; /* list of struct work_item */ }; extern void work_item_init(work_func_t func, void *data, struct work_item *out); extern void workqueue_init(struct workqueue *wq); extern struct worker_pool *worker_pool_create(size_t nworkers); extern struct worker_pool *global_worker_pool(void); extern bool schedule_work_on(struct workqueue *wq, struct work_item *work); extern bool schedule_work(struct work_item *work); extern void wake_workers(struct workqueue *wq, struct worker_pool *pool); #endif