void dt_dev_process_preview(dt_develop_t *dev) { if(!dev->gui_attached) return; dt_job_t job; dt_dev_process_preview_job_init(&job, dev); int err = dt_control_add_job_res(darktable.control, &job, DT_CTL_WORKER_3); if(err) fprintf(stderr, "[dev_process_preview] job queue exceeded!\n"); }
void dt_dev_process_image(dt_develop_t *dev) { if(/*dev->image_loading ||*/ !dev->gui_attached || dev->pipe->processing) return; dt_job_t job; dt_dev_process_image_job_init(&job, dev); int err = dt_control_add_job_res(darktable.control, &job, DT_CTL_WORKER_2); if(err) fprintf(stderr, "[dev_process_image] job queue exceeded!\n"); }
int32_t dt_control_run_job(dt_control_t *s) { dt_job_t *j=NULL,*bj=NULL; dt_pthread_mutex_lock(&s->queue_mutex); /* check if queue is empty */ if(g_list_length(s->queue) == 0) { dt_pthread_mutex_unlock(&s->queue_mutex); return -1; } /* go thru the queue and find one normal job and a background job that is up for execution.*/ time_t ts_now = time(NULL); GList *jobitem=g_list_first(s->queue); if(jobitem) do { dt_job_t *tj = jobitem->data; /* check if it's a scheduled job and is waiting to be executed */ if(!bj && (tj->ts_execute > tj->ts_added) && tj->ts_execute <= ts_now) bj = tj; else if ((tj->ts_execute < tj->ts_added) && !j) j = tj; /* if we got a normal job, and a background job, we are finished */ if(bj && j) break; } while ((jobitem = g_list_next(jobitem))); /* remove the found jobs from queue */ if (bj) s->queue = g_list_remove(s->queue, bj); if (j) s->queue = g_list_remove(s->queue, j); /* unlock the queue */ dt_pthread_mutex_unlock(&s->queue_mutex); /* push background job on reserved background worker */ if(bj) { dt_control_add_job_res(s,bj,DT_CTL_WORKER_7); g_free (bj); } /* don't continue if we don't have have a job to execute */ if(!j) return -1; /* change state to running */ dt_pthread_mutex_lock (&j->wait_mutex); if (dt_control_job_get_state (j) == DT_JOB_STATE_QUEUED) { dt_print(DT_DEBUG_CONTROL, "[run_job+] %02d %f ", DT_CTL_WORKER_RESERVED+dt_control_get_threadid(), dt_get_wtime()); dt_control_job_print(j); dt_print(DT_DEBUG_CONTROL, "\n"); _control_job_set_state (j,DT_JOB_STATE_RUNNING); /* execute job */ j->result = j->execute (j); _control_job_set_state (j,DT_JOB_STATE_FINISHED); dt_print(DT_DEBUG_CONTROL, "[run_job-] %02d %f ", DT_CTL_WORKER_RESERVED+dt_control_get_threadid(), dt_get_wtime()); dt_control_job_print(j); dt_print(DT_DEBUG_CONTROL, "\n"); /* free job */ dt_pthread_mutex_unlock (&j->wait_mutex); g_free(j); j = NULL; } if(j) dt_pthread_mutex_unlock (&j->wait_mutex); return 0; }