Blender V4.3
wm_jobs.cc File Reference
#include <cstring>
#include "DNA_windowmanager_types.h"
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_threads.h"
#include "BLI_time.h"
#include "BLI_utildefines.h"
#include "BKE_global.hh"
#include "BKE_report.hh"
#include "SEQ_prefetch.hh"
#include "WM_api.hh"
#include "WM_types.hh"
#include "wm.hh"
#include "wm_event_types.hh"

Go to the source code of this file.

Classes

struct  wmJob
 

Functions

void WM_job_main_thread_lock_acquire (wmJob *wm_job)
 
void WM_job_main_thread_lock_release (wmJob *wm_job)
 
static void wm_job_main_thread_yield (wmJob *wm_job)
 
static wmJobwm_job_find (const wmWindowManager *wm, const void *owner, const eWM_JobType job_type)
 
wmJobWM_jobs_get (wmWindowManager *wm, wmWindow *win, const void *owner, const char *name, const eWM_JobFlag flag, const eWM_JobType job_type)
 
bool WM_jobs_test (const wmWindowManager *wm, const void *owner, int job_type)
 
float WM_jobs_progress (const wmWindowManager *wm, const void *owner)
 
static void wm_jobs_update_progress_bars (wmWindowManager *wm)
 
double WM_jobs_starttime (const wmWindowManager *wm, const void *owner)
 
const char * WM_jobs_name (const wmWindowManager *wm, const void *owner)
 
void * WM_jobs_customdata_from_type (wmWindowManager *wm, const void *owner, int job_type)
 
bool WM_jobs_is_running (const wmJob *wm_job)
 
bool WM_jobs_is_stopped (const wmWindowManager *wm, const void *owner)
 
void * WM_jobs_customdata_get (wmJob *wm_job)
 
void WM_jobs_customdata_set (wmJob *wm_job, void *customdata, void(*free)(void *customdata))
 
void WM_jobs_timer (wmJob *wm_job, double time_step, uint note, uint endnote)
 
void WM_jobs_delay_start (wmJob *wm_job, double delay_time)
 
void WM_jobs_callbacks (wmJob *wm_job, wm_jobs_start_callback startjob, void(*initjob)(void *), void(*update)(void *), void(*endjob)(void *))
 
void WM_jobs_callbacks_ex (wmJob *wm_job, wm_jobs_start_callback startjob, void(*initjob)(void *), void(*update)(void *), void(*endjob)(void *), void(*completed)(void *), void(*canceled)(void *))
 
static void wm_jobs_reports_update (wmWindowManager *wm, wmJob *wm_job)
 
static void * do_job_thread (void *job_v)
 
static void wm_jobs_test_suspend_stop (wmWindowManager *wm, wmJob *test)
 
void WM_jobs_start (wmWindowManager *wm, wmJob *wm_job)
 
static void wm_job_end (wmWindowManager *wm, wmJob *wm_job)
 
static void wm_job_free (wmWindowManager *wm, wmJob *wm_job)
 
static void wm_jobs_kill_job (wmWindowManager *wm, wmJob *wm_job)
 
void WM_jobs_kill_all (wmWindowManager *wm)
 
void WM_jobs_kill_all_except (wmWindowManager *wm, const void *owner)
 
void WM_jobs_kill_type (wmWindowManager *wm, const void *owner, int job_type)
 
void WM_jobs_kill_all_from_owner (wmWindowManager *wm, const void *owner)
 
void WM_jobs_stop_type (wmWindowManager *wm, const void *owner, eWM_JobType job_type)
 
void WM_jobs_stop_all_from_owner (wmWindowManager *wm, const void *owner)
 
void wm_jobs_timer_end (wmWindowManager *wm, wmTimer *wt)
 
void wm_jobs_timer (wmWindowManager *wm, wmTimer *wt)
 
bool WM_jobs_has_running (const wmWindowManager *wm)
 
bool WM_jobs_has_running_type (const wmWindowManager *wm, int job_type)
 

Detailed Description

Threaded job manager (high level job access).

Definition in file wm_jobs.cc.

Function Documentation

◆ do_job_thread()

static void * do_job_thread ( void * job_v)
static

Definition at line 394 of file wm_jobs.cc.

References wmJob::ready, wmJob::run_customdata, wmJob::startjob, and wmJob::worker_status.

Referenced by WM_jobs_start().

◆ wm_job_end()

◆ wm_job_find()

static wmJob * wm_job_find ( const wmWindowManager * wm,
const void * owner,
const eWM_JobType job_type )
static

Finds if type or owner, compare for it, otherwise any matching job.

Definition at line 160 of file wm_jobs.cc.

References wmWindowManager::jobs, LISTBASE_FOREACH, and WM_JOB_TYPE_ANY.

Referenced by WM_jobs_customdata_from_type(), WM_jobs_get(), WM_jobs_is_stopped(), WM_jobs_name(), WM_jobs_progress(), and WM_jobs_starttime().

◆ wm_job_free()

◆ WM_job_main_thread_lock_acquire()

void WM_job_main_thread_lock_acquire ( wmJob * wm_job)

Definition at line 139 of file wm_jobs.cc.

References BLI_ticket_mutex_lock(), and wmJob::main_thread_mutex.

Referenced by WM_jobs_get(), wm_jobs_kill_job(), and wm_jobs_timer().

◆ WM_job_main_thread_lock_release()

void WM_job_main_thread_lock_release ( wmJob * wm_job)

Definition at line 144 of file wm_jobs.cc.

References BLI_ticket_mutex_unlock(), and wmJob::main_thread_mutex.

Referenced by wm_job_free(), wm_jobs_kill_job(), and wm_jobs_timer().

◆ wm_job_main_thread_yield()

static void wm_job_main_thread_yield ( wmJob * wm_job)
static

Definition at line 149 of file wm_jobs.cc.

References BLI_ticket_mutex_lock(), BLI_ticket_mutex_unlock(), and wmJob::main_thread_mutex.

Referenced by wm_jobs_timer().

◆ WM_jobs_callbacks()

◆ WM_jobs_callbacks_ex()

void WM_jobs_callbacks_ex ( wmJob * wm_job,
wm_jobs_start_callback startjob,
void(* initjob )(void *),
void(* update )(void *),
void(* endjob )(void *),
void(* completed )(void *),
void(* canceled )(void *) )

◆ WM_jobs_customdata_from_type()

void * WM_jobs_customdata_from_type ( wmWindowManager * wm,
const void * owner,
int job_type )

◆ WM_jobs_customdata_get()

◆ WM_jobs_customdata_set()

◆ WM_jobs_delay_start()

void WM_jobs_delay_start ( wmJob * wm_job,
double delay_time )

Definition at line 359 of file wm_jobs.cc.

References wmJob::start_delay_time.

Referenced by ED_preview_icon_job(), and screen_render_invoke().

◆ WM_jobs_get()

wmJob * WM_jobs_get ( wmWindowManager * wm,
wmWindow * win,
const void * owner,
const char * name,
eWM_JobFlag flag,
eWM_JobType job_type )
Returns
current job or adds new job, but doesn't run it.
Note
every owner only gets a single running job of the same job_type (or with the WM_JOB_EXCL_RENDER flag). Adding a new one will wait for the running job to finish.

Definition at line 189 of file wm_jobs.cc.

References BKE_report_print_level_set(), BKE_reports_init(), BLI_addtail(), BLI_assert, BLI_ticket_mutex_alloc(), flag, wmJob::flag, wmJob::job_type, wmWindowManager::jobs, wmJob::main_thread_mutex, MEM_callocN, wmJob::name, wmJob::owner, wmJobWorkerStatus::reports, RPT_PRINT, RPT_STORE, RPT_WARNING, STRNCPY, wmJob::win, wm_job_find(), WM_job_main_thread_lock_acquire(), WM_JOB_TYPE_ANY, and wmJob::worker_status.

Referenced by ABC_export(), ABC_import(), blender::ed::object::bake_invoke(), clip_rebuild_proxy_exec(), clip_start_prefetch_job(), dynamicpaint_bake_exec(), ED_node_composite_job(), ED_preview_icon_job(), ED_preview_shader_job(), ED_seq_proxy_wm_job_get(), EEVEE_NEXT_lightbake_job_create(), blender::seq::ThumbGenerationJob::ensure_job(), PreviewLoadJob::ensure_job(), blender::ed::space_node::ensure_nodetree_previews(), filelist_readjob_start(), fluid_bake_invoke(), fluid_free_exec(), fsmenu_bookmark_validate_job_start(), lineart_bake_common(), blender::ed::object::multiresbake_image_exec(), blender::ed::object::ocean_bake_exec(), pack_islands_exec(), ptcache_bake_invoke(), blender::ed::object::quadriflow_remesh_exec(), screen_render_invoke(), sequencer_preview_add_sound(), blender::ed::object::bake_simulation::simulate_to_frame_invoke(), solve_camera_invoke(), start_audio_video_job(), blender::ed::object::bake_simulation::start_bake_job(), track_markers(), ui_icon_ensure_deferred(), blender::io::usd::USD_export(), and blender::io::usd::USD_import().

◆ WM_jobs_has_running()

bool WM_jobs_has_running ( const wmWindowManager * wm)

Definition at line 745 of file wm_jobs.cc.

References wmWindowManager::jobs, LISTBASE_FOREACH, and wmJob::running.

◆ WM_jobs_has_running_type()

bool WM_jobs_has_running_type ( const wmWindowManager * wm,
int job_type )

Definition at line 756 of file wm_jobs.cc.

References wmJob::job_type, wmWindowManager::jobs, LISTBASE_FOREACH, and wmJob::running.

Referenced by bpy_app_is_job_running().

◆ WM_jobs_is_running()

◆ WM_jobs_is_stopped()

bool WM_jobs_is_stopped ( const wmWindowManager * wm,
const void * owner )

◆ WM_jobs_kill_all()

void WM_jobs_kill_all ( wmWindowManager * wm)

Wait until every job ended.

Definition at line 576 of file wm_jobs.cc.

References ListBase::first, wmWindowManager::jobs, SEQ_prefetch_stop_all(), and wm_jobs_kill_job().

Referenced by ed_undo_step_pre(), WM_exit_ex(), and wm_file_read_setup_wm_init().

◆ WM_jobs_kill_all_except()

void WM_jobs_kill_all_except ( wmWindowManager * wm,
const void * owner )

Wait until every job ended, except for one owner (used in undo to keep screen job alive).

Definition at line 588 of file wm_jobs.cc.

References wmWindowManager::jobs, LISTBASE_FOREACH_MUTABLE, wmJob::owner, and wm_jobs_kill_job().

Referenced by screen_opengl_render_init(), and screen_render_invoke().

◆ WM_jobs_kill_all_from_owner()

void WM_jobs_kill_all_from_owner ( wmWindowManager * wm,
const void * owner )

Terminate thread and timer of all jobs from this owner.

Beware of the impact of calling this. For example passing the scene will kill all jobs having the scene as owner, even otherwise unrelated jobs.

Definition at line 612 of file wm_jobs.cc.

References wmWindowManager::jobs, LISTBASE_FOREACH_MUTABLE, wmJob::owner, and wm_jobs_kill_job().

Referenced by ED_scene_delete().

◆ wm_jobs_kill_job()

◆ WM_jobs_kill_type()

◆ WM_jobs_name()

const char * WM_jobs_name ( const wmWindowManager * wm,
const void * owner )

Definition at line 295 of file wm_jobs.cc.

References wmJob::name, wm_job_find(), and WM_JOB_TYPE_ANY.

Referenced by uiTemplateRunningJobs().

◆ WM_jobs_progress()

float WM_jobs_progress ( const wmWindowManager * wm,
const void * owner )

◆ wm_jobs_reports_update()

static void wm_jobs_reports_update ( wmWindowManager * wm,
wmJob * wm_job )
static

◆ WM_jobs_start()

void WM_jobs_start ( wmWindowManager * wm,
wmJob * wm_job )

Register the given wm_job and try to start it immediately.

The new wm_job will not start immediately and wait for other blocking jobs to end in some way if:

  • the new job is flagged with WM_JOB_EXCL_RENDER and another job with the same flag is already running (blocks it), or...
  • the new job is not flagged with WM_JOB_EXCL_RENDER and a job of the same eWM_JobType is already running (blocks it).

If the new wm_job is flagged with WM_JOB_PRIORITY, it will request other blocking jobs to stop (using #WM_jobs_stop(), so this doesn't take immediate effect) rather than finish its work.

Definition at line 455 of file wm_jobs.cc.

References BLI_threadpool_init(), BLI_threadpool_insert(), BLI_time_now_seconds(), wmJob::customdata, do_job_thread(), wmJob::free, wmJob::initjob, printf, wmJobWorkerStatus::progress, wmJob::ready, wmJob::run_customdata, wmJob::run_free, wmJob::running, wmJob::start_delay_time, wmJob::start_time, wmJob::startjob, wmJobWorkerStatus::stop, wmJob::suspended, wmJob::threads, wmJob::time_step, wmTimer::time_step, TIMERJOBS, wmJob::win, WM_event_timer_add(), WM_event_timer_remove(), wm_jobs_test_suspend_stop(), wmJob::worker_status, and wmJob::wt.

Referenced by ABC_export(), ABC_import(), blender::ed::object::bake_invoke(), clip_rebuild_proxy_exec(), clip_start_prefetch_job(), dynamicpaint_bake_exec(), ED_node_composite_job(), ED_preview_icon_job(), ED_preview_shader_job(), blender::seq::ThumbGenerationJob::ensure_job(), PreviewLoadJob::ensure_job(), blender::ed::space_node::ensure_nodetree_previews(), filelist_readjob_start(), fluid_bake_invoke(), fluid_free_exec(), fsmenu_bookmark_validate_job_start(), lightprobe_cache_bake_invoke(), lineart_bake_common(), blender::ed::object::multiresbake_image_exec(), blender::ed::object::ocean_bake_exec(), pack_islands_exec(), ptcache_bake_invoke(), blender::ed::object::quadriflow_remesh_exec(), screen_render_invoke(), seq_build_proxy(), seq_proxy_build_job(), sequencer_preview_add_sound(), blender::ed::object::bake_simulation::simulate_to_frame_invoke(), solve_camera_invoke(), start_audio_video_job(), blender::ed::object::bake_simulation::start_bake_job(), track_markers(), ui_icon_ensure_deferred(), blender::io::usd::USD_export(), blender::io::usd::USD_import(), and wm_jobs_timer().

◆ WM_jobs_starttime()

double WM_jobs_starttime ( const wmWindowManager * wm,
const void * owner )

Time that job started.

Definition at line 284 of file wm_jobs.cc.

References wmJob::flag, wmJob::start_time, wm_job_find(), WM_JOB_PROGRESS, and WM_JOB_TYPE_ANY.

Referenced by progress_tooltip_func().

◆ WM_jobs_stop_all_from_owner()

void WM_jobs_stop_all_from_owner ( wmWindowManager * wm,
const void * owner )

Signal all jobs from this owner to stop, timer is required to get handled.

Beware of the impact of calling this. For example passing the scene will stop all jobs having the scene as owner, even otherwise unrelated jobs.

Definition at line 637 of file wm_jobs.cc.

References wmWindowManager::jobs, LISTBASE_FOREACH, wmJob::owner, wmJob::running, wmJobWorkerStatus::stop, and wmJob::worker_status.

Referenced by do_running_jobs().

◆ WM_jobs_stop_type()

void WM_jobs_stop_type ( wmWindowManager * wm,
const void * owner,
eWM_JobType job_type )

Signal all jobs of this type and owner (if non-null) to stop, timer is required to get handled.

Don't pass WM_JOB_TYPE_ANY as job_type. Use WM_jobs_stop_all_from_owner() instead.

Definition at line 621 of file wm_jobs.cc.

References BLI_assert, wmJob::job_type, wmWindowManager::jobs, LISTBASE_FOREACH, wmJob::owner, wmJob::running, wmJobWorkerStatus::stop, WM_JOB_TYPE_ANY, and wmJob::worker_status.

Referenced by EEVEE_NEXT_lightbake_job_create(), and blender::ed::space_node::ensure_nodetree_previews().

◆ WM_jobs_test()

◆ wm_jobs_test_suspend_stop()

◆ WM_jobs_timer()

◆ wm_jobs_timer()

◆ wm_jobs_timer_end()

void wm_jobs_timer_end ( wmWindowManager * wm,
wmTimer * wt )

Kill job entirely, also removes timer itself.

Definition at line 648 of file wm_jobs.cc.

References BLI_findptr(), wmWindowManager::jobs, offsetof, and wm_jobs_kill_job().

Referenced by wm_window_free().

◆ wm_jobs_update_progress_bars()

static void wm_jobs_update_progress_bars ( wmWindowManager * wm)
static