31#define DT_CONTROL_FG_PRIORITY 4
38#define DT_CONTROL_MAX_JOBS 840
259 int max_priority = -1;
262 if(control->
queues[
i] == NULL)
continue;
284 GList **queue = &control->
queues[winner_queue];
285 *queue = g_list_delete_link(*queue, *queue);
295 if(
i == winner_queue || control->
queues[
i] == NULL)
continue;
378 pthread_cond_broadcast(&control->
cond);
424 job->
queue = queue_id;
430 GList **queue = &control->
queues[queue_id];
462 for(GList *iter = *queue; iter; iter = g_list_next(iter))
471 *queue = g_list_delete_link(*queue, iter);
474 job_for_disposal = job;
482 *queue = g_list_prepend(*queue, job);
488 GList *last = g_list_last(*queue);
491 *queue = g_list_delete_link(*queue, last);
506 *queue = g_list_append(*queue, job);
514 pthread_cond_broadcast(&control->
cond);
558 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old);
563 pthread_setcancelstate(old, &tmp);
577 pthread_cond_broadcast(&control->
cond);
653 params->self = control;
654 params->threadid =
k;
667 params->self = control;
668 params->threadid =
k;
678 if(control->
queues[
i] == NULL)
continue;
size_t params_size(dt_imageio_module_format_t *self)
void dt_print(dt_debug_thread_t thread, const char *msg,...)
static const dt_aligned_pixel_simd_t value
static double dt_get_wtime(void)
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
int dt_pthread_create(pthread_t *thread, void *(*start_routine)(void *), void *arg, const gboolean realtime)
void dt_pthread_setname(const char *name)
static int dt_pthread_mutex_unlock(dt_pthread_mutex_t *mutex) RELEASE(mutex) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_mutex_init(dt_pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
static int dt_pthread_mutex_destroy(dt_pthread_mutex_t *mutex)
static int dt_pthread_cond_wait(pthread_cond_t *cond, dt_pthread_mutex_t *mutex)
static int dt_pthread_mutex_lock(dt_pthread_mutex_t *mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS
static void dt_control_job_execute(_dt_job_t *job)
void dt_control_flush_jobs_queue(dt_control_t *control, dt_job_queue_t queue_id)
static _dt_job_t * dt_control_schedule_job(dt_control_t *control)
static int32_t dt_control_run_job(dt_control_t *control)
static int32_t dt_control_run_job_res(dt_control_t *control, int32_t res)
static void dt_control_job_set_state(_dt_job_t *job, dt_job_state_t state)
dt_job_state_t dt_control_job_get_state(_dt_job_t *job)
void dt_control_job_cancel(_dt_job_t *job)
static void * dt_control_work(void *ptr)
dt_job_t * dt_control_job_create(dt_job_execute_callback execute, const char *msg,...)
int dt_control_add_job(dt_control_t *control, dt_job_queue_t queue_id, _dt_job_t *job)
int32_t dt_control_add_job_res(dt_control_t *control, _dt_job_t *job, int32_t res)
void * dt_control_job_get_params(const _dt_job_t *job)
double dt_control_job_get_progress(dt_job_t *job)
static void dt_control_job_print(_dt_job_t *job)
void dt_control_job_set_progress(dt_job_t *job, double value)
void dt_control_jobs_cleanup(dt_control_t *control)
void dt_control_job_add_progress(dt_job_t *job, const char *message, gboolean cancellable)
void dt_control_job_set_progress_message(dt_job_t *job, const char *message)
#define DT_CONTROL_FG_PRIORITY
void dt_control_job_set_params_with_size(dt_job_t *job, void *params, size_t params_size, dt_job_destroy_callback callback)
void dt_control_job_wait(_dt_job_t *job)
void dt_control_job_set_state_callback(_dt_job_t *job, dt_job_state_change_callback cb)
int32_t dt_control_get_threadid()
static void * dt_control_work_res(void *ptr)
void dt_control_jobs_init(dt_control_t *control)
void dt_control_job_set_params(_dt_job_t *job, void *params, dt_job_destroy_callback callback)
static void * dt_control_worker_kicker(void *ptr)
static int dt_control_job_equal(_dt_job_t *j1, _dt_job_t *j2)
#define DT_CONTROL_MAX_JOBS
static __thread int threadid
void dt_control_job_dispose(_dt_job_t *job)
static int32_t dt_control_get_threadid_res()
void(* dt_job_state_change_callback)(dt_job_t *, dt_job_state_t state)
#define DT_CONTROL_DESCRIPTION_LEN
@ DT_JOB_QUEUE_USER_EXPORT
int32_t(* dt_job_execute_callback)(dt_job_t *)
void(* dt_job_destroy_callback)(void *data)
#define DT_CTL_WORKER_RESERVED
@ DT_JOB_STATE_INITIALIZED
float *const restrict const size_t k
void dt_control_progress_set_progress(dt_control_t *control, dt_progress_t *progress, double value)
void dt_control_progress_set_message(dt_control_t *control, dt_progress_t *progress, const char *message)
double dt_control_progress_get_progress(dt_progress_t *progress)
dt_progress_t * dt_control_progress_create(dt_control_t *control, gboolean has_progress_bar, const gchar *message)
void dt_control_progress_destroy(dt_control_t *control, dt_progress_t *progress)
void dt_control_progress_attach_job(dt_control_t *control, dt_progress_t *progress, dt_job_t *job)
const float uint32_t state[4]
dt_pthread_mutex_t state_mutex
dt_job_destroy_callback params_destroy
dt_job_state_change_callback state_changed_cb
dt_pthread_mutex_t wait_mutex
char description[DT_CONTROL_DESCRIPTION_LEN]
dt_job_execute_callback execute
int32_t num_openmp_threads
struct dt_control_t * control
dt_pthread_mutex_t run_mutex
GList * queues[DT_JOB_QUEUE_MAX]
gboolean export_scheduled
pthread_t thread_res[DT_CTL_WORKER_RESERVED]
dt_pthread_mutex_t res_mutex
pthread_t kick_on_workers_thread
dt_pthread_mutex_t queue_mutex
uint8_t new_res[DT_CTL_WORKER_RESERVED]
dt_job_t * job_res[DT_CTL_WORKER_RESERVED]
dt_pthread_mutex_t cond_mutex
size_t queue_length[DT_JOB_QUEUE_MAX]