1d60bafe5SSasha Levin #ifndef KVM__THREADPOOL_H
2d60bafe5SSasha Levin #define KVM__THREADPOOL_H
3d60bafe5SSasha Levin
4df0c7f57SSasha Levin #include "kvm/mutex.h"
5df0c7f57SSasha Levin
6df0c7f57SSasha Levin #include <linux/list.h>
7df0c7f57SSasha Levin
8d60bafe5SSasha Levin struct kvm;
9d60bafe5SSasha Levin
10d60bafe5SSasha Levin typedef void (*kvm_thread_callback_fn_t)(struct kvm *kvm, void *data);
11d60bafe5SSasha Levin
12df0c7f57SSasha Levin struct thread_pool__job {
13df0c7f57SSasha Levin kvm_thread_callback_fn_t callback;
14df0c7f57SSasha Levin struct kvm *kvm;
15df0c7f57SSasha Levin void *data;
16df0c7f57SSasha Levin
17df0c7f57SSasha Levin int signalcount;
18d3476f7dSSasha Levin struct mutex mutex;
19df0c7f57SSasha Levin
20df0c7f57SSasha Levin struct list_head queue;
21df0c7f57SSasha Levin };
22df0c7f57SSasha Levin
thread_pool__init_job(struct thread_pool__job * job,struct kvm * kvm,kvm_thread_callback_fn_t callback,void * data)23df0c7f57SSasha Levin static inline void thread_pool__init_job(struct thread_pool__job *job, struct kvm *kvm, kvm_thread_callback_fn_t callback, void *data)
24df0c7f57SSasha Levin {
25df0c7f57SSasha Levin *job = (struct thread_pool__job) {
26df0c7f57SSasha Levin .kvm = kvm,
27df0c7f57SSasha Levin .callback = callback,
28df0c7f57SSasha Levin .data = data,
29d3476f7dSSasha Levin .mutex = MUTEX_INITIALIZER,
30df0c7f57SSasha Levin };
31*7a7f4542SJean-Philippe Brucker INIT_LIST_HEAD(&job->queue);
32df0c7f57SSasha Levin }
33df0c7f57SSasha Levin
34f6a3c571SSasha Levin int thread_pool__init(struct kvm *kvm);
35f6a3c571SSasha Levin int thread_pool__exit(struct kvm *kvm);
36d60bafe5SSasha Levin
37df0c7f57SSasha Levin void thread_pool__do_job(struct thread_pool__job *job);
38*7a7f4542SJean-Philippe Brucker void thread_pool__cancel_job(struct thread_pool__job *job);
39d60bafe5SSasha Levin
40d60bafe5SSasha Levin #endif
41