84 ret = pthread_mutex_init(&
m_lock, NULL);
99 pthread_mutex_destroy(&
m_lock);
129 pthread_mutex_lock(&
m_lock);
135 pthread_mutex_unlock(&
m_lock);
138 if(data->
m_task == NULL) {
145 pthread_mutex_lock(&
m_lock);
153 pthread_mutex_unlock(&
m_lock);
158 pthread_mutex_lock(&
m_lock);
159 assert(
m_data.size() == 0);
161 pthread_mutex_unlock(&
m_lock);
168 pthread_mutex_lock(&
m_lock);
174 pthread_mutex_unlock(&
m_lock);
187 pthread_mutex_init(&
m_lock, NULL);
192 pthread_mutex_lock(&
m_lock);
196 pthread_mutex_unlock(&
m_lock);
201 pthread_mutex_destroy(&
m_lock);
205 pthread_mutex_lock(&
m_lock);
208 pthread_mutex_unlock(&
m_lock);
225 pthread_mutex_lock(&
m_lock);
238 pthread_mutex_unlock(&
m_lock);
296 if (worker_count == 1) {
301 vector<task_result_handle_t> tasks(worker_count);
302 for (
int i = 0; i < worker_count; ++i) {
303 tasks[i] =
task_run_async(task, (
void *)((
char *) data + i * data_size));
305 for (
int i = 0; i < worker_count; ++i) {
306 if (res !=
nullptr) {
323 data->c(data->in, data->out, data->data_len, data->udata);
337 for (
int i = 0; i < threads; ++i) {
339 data[i].
in = (
char *)
in + i * (nmemb / threads) * size;
340 data[i].
out = (
char *)
out + i * (nmemb / threads) * size;
341 data[i].
data_len = (nmemb / threads) * size;
343 if (i == threads - 1) {
344 data[i].
data_len = size * (nmemb - (threads - 1) * (nmemb / threads));
pthread_cond_t m_worker_finished
void * wait_task(task_result_handle_t handle)
task_result_handle_t run_async(runnable_t task, void *data, bool detached)
set< wp_worker * > m_empty_workers
set< wp_worker * > m_occupied_workers
void notify(wp_worker *w)
@ MAX_CPU_CORES
maximal expected CPU core count
int get_cpu_core_count(void)
respawn_parallel_callback_t c
virtual void notify(wp_worker *)=0
virtual ~worker_state_observer()
Holds data to be passed to worker.
wp_task_data(runnable_t task, void *data, wp_worker *w, bool detached)
This class represents a worker that is called from within the pool.
worker_state_observer & m_state_observer
pthread_cond_t m_task_ready_cv
void * pop(wp_task_data *)
wp_worker(worker_state_observer &observer)
pthread_cond_t m_task_completed_cv
static void * enter_loop(void *args)
void push(wp_task_data *)
queue< wp_task_data * > m_data
void set_thread_name(const char *name)
void task_run_async_detached(runnable_t task, void *data)
Runs task asynchronously in a detached state.
void * wait_task(task_result_handle_t handle)
void respawn_parallel(void *in, void *out, size_t nmemb, size_t size, respawn_parallel_callback_t c, void *udata)
void task_run_parallel(runnable_t task, int worker_count, void *data, size_t data_size, void **res)
task_result_handle_t task_run_async(runnable_t task, void *data)
Runs task asynchronously.
static void func_delete(wp_worker *arg)
static void * respawn_parallel_task(void *arg)
static class worker_pool instance
void * task_result_handle_t
void(* respawn_parallel_callback_t)(void *in, void *out, size_t data_len, void *udata)
void *(* runnable_t)(void *)