34#define DT_CONTROL_FG_PRIORITY 4
41#define DT_CONTROL_MAX_JOBS 840
273 int max_priority = -1;
276 if(control->
queues[
i] == NULL)
continue;
298 GList **queue = &control->
queues[winner_queue];
299 *queue = g_list_delete_link(*queue, *queue);
309 if(
i == winner_queue || control->
queues[
i] == NULL)
continue;
392 pthread_cond_broadcast(&control->
cond);
438 job->
queue = queue_id;
444 GList **queue = &control->
queues[queue_id];
476 for(GList *iter = *queue; iter; iter = g_list_next(iter))
485 *queue = g_list_delete_link(*queue, iter);
488 job_for_disposal = job;
496 *queue = g_list_prepend(*queue, job);
502 GList *last = g_list_last(*queue);
505 *queue = g_list_delete_link(*queue, last);
520 *queue = g_list_append(*queue, job);
528 pthread_cond_broadcast(&control->
cond);
583 return (int32_t)count;
620 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old);
625 pthread_setcancelstate(old, &tmp);
643 const gint64 end = g_get_real_time() + 2 * G_USEC_PER_SEC;
644 const struct timespec deadline = { .tv_sec = end / G_USEC_PER_SEC,
645 .tv_nsec = (end % G_USEC_PER_SEC) * 1000 };
648 timed_out = pthread_cond_timedwait(&control->
cond, &control->
cond_mutex.mutex, &deadline);
649 pthread_cond_broadcast(&control->
cond);
755 GList *doomed = NULL;
759 doomed = g_list_concat(doomed, control->
queues[
i]);
766 for(GList *l = doomed; l; l = g_list_next(l))
size_t params_size(dt_imageio_module_format_t *self)
struct dt_control_t * dt_control_get_global(void)
int dt_get_num_openmp_threads(void)
Number of OpenMP threads the application decided to use.
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)
Initialise a mutex. With mutexattr NULL – which is how 54 of the 56 call sites in this tree spell it ...
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)
Wait on cond, releasing mutex for the duration.
static int dt_pthread_mutex_lock(dt_pthread_mutex_t *mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS
void dt_control_running_jobs_foreach(dt_control_t *control, dt_control_running_jobs_foreach_callback_t callback, void *data)
int32_t dt_control_queued_jobs_count(dt_control_t *control)
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 gint _workers_alive
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_jobs_drain(dt_control_t *control)
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)
static _dt_job_t * _job_res_running[DT_CTL_WORKER_RESERVED]
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)
int32_t dt_control_workers_alive(void)
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
void(* dt_control_running_jobs_foreach_callback_t)(const char *description, dt_job_queue_t queue, gboolean reserved, void *data)
@ DT_JOB_STATE_INITIALIZED
static const dt_iop_drawlayer_params_t * params
void dt_print(dt_debug_thread_t thread, const char *msg,...) __attribute__((format(printf
Print to stdout when thread is enabled, prefixed with seconds since startup.
float *const restrict const size_t k
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
#define dt_free(ptr)
g_free() ptr and set it to NULL, skipping both if it is already NULL.
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)
static const dt_aligned_pixel_simd_t value
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
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]
static double dt_get_wtime(void)