Blender V4.5
wm_jobs.cc File Reference
#include <cstring>
#include "DNA_windowmanager_types.h"
#include "MEM_guardedalloc.h"
#include "BLI_listbase.h"
#include "BLI_string.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()

void * do_job_thread ( void * job_v)
static

◆ wm_job_end()

◆ wm_job_find()

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 161 of file wm_jobs.cc.

References wmWindowManager::jobs, LISTBASE_FOREACH, wm_job_find(), and WM_JOB_TYPE_ANY.

Referenced by wm_job_find(), 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()

◆ WM_job_main_thread_lock_release()

◆ wm_job_main_thread_yield()

void wm_job_main_thread_yield ( wmJob * wm_job)
static

◆ 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 )

◆ 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 190 of file wm_jobs.cc.

References BKE_report_print_level_set(), BKE_reports_init(), BLI_addtail(), BLI_assert, BLI_ticket_mutex_alloc(), wmJob::flag, wmJob::job_type, wmWindowManager::jobs, wmJob::main_thread_mutex, MEM_callocN(), wmJob::name, wmJob::owner, RPT_PRINT, RPT_STORE, RPT_WARNING, STRNCPY(), wmJob::win, wm_job_find(), WM_job_main_thread_lock_acquire(), WM_JOB_TYPE_ANY, WM_jobs_get(), 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(), blender::seq::ED_seq_proxy_wm_job_get(), EEVEE_lightbake_job_create(), blender::seq::ThumbGenerationJob::ensure_job(), PreviewLoadJob::ensure_job(), blender::ed::space_node::ensure_nodetree_previews(), filelist_readjob_start_ex(), 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_opengl_render_invoke(), screen_render_invoke(), blender::ed::vse::sequencer_preview_add_sound(), blender::ed::object::bake_simulation::simulate_to_frame_invoke(), solve_camera_invoke(), blender::ed::vse::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_get().

◆ WM_jobs_has_running()

bool WM_jobs_has_running ( const wmWindowManager * wm)

◆ WM_jobs_has_running_type()

bool WM_jobs_has_running_type ( const wmWindowManager * wm,
int job_type )

◆ 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)

◆ 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 589 of file wm_jobs.cc.

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

Referenced by screen_opengl_render_init(), screen_render_invoke(), and WM_jobs_kill_all_except().

◆ 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 613 of file wm_jobs.cc.

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

Referenced by ED_scene_delete(), and WM_jobs_kill_all_from_owner().

◆ 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 296 of file wm_jobs.cc.

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

Referenced by uiTemplateRunningJobs(), and WM_jobs_name().

◆ WM_jobs_progress()

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

◆ wm_jobs_reports_update()

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 456 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, wmJob::ready, wmJob::run_customdata, wmJob::run_free, wmJob::running, wmJob::start_delay_time, wmJob::start_time, wmJob::startjob, wmJob::suspended, wmJob::threads, wmJob::time_step, wmTimer::time_step, TIMERJOBS, wmJob::win, WM_event_timer_add(), WM_event_timer_remove(), WM_jobs_start(), 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_ex(), 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_opengl_render_invoke(), screen_render_invoke(), blender::ed::vse::seq_build_proxy(), blender::ed::vse::seq_proxy_build_job(), blender::ed::vse::sequencer_preview_add_sound(), blender::ed::object::bake_simulation::simulate_to_frame_invoke(), solve_camera_invoke(), blender::ed::vse::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(), WM_jobs_start(), and wm_jobs_timer().

◆ WM_jobs_starttime()

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

Time that job started.

Definition at line 285 of file wm_jobs.cc.

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

Referenced by progress_tooltip_func(), and WM_jobs_starttime().

◆ 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 638 of file wm_jobs.cc.

References wmWindowManager::jobs, LISTBASE_FOREACH, wmJob::owner, wmJob::running, WM_jobs_stop_all_from_owner(), and wmJob::worker_status.

Referenced by do_running_jobs(), and WM_jobs_stop_all_from_owner().

◆ 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 622 of file wm_jobs.cc.

References BLI_assert, wmJob::job_type, wmWindowManager::jobs, LISTBASE_FOREACH, wmJob::owner, wmJob::running, WM_JOB_TYPE_ANY, WM_jobs_stop_type(), and wmJob::worker_status.

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

◆ 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 649 of file wm_jobs.cc.

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

Referenced by wm_jobs_timer_end(), and wm_window_free().

◆ wm_jobs_update_progress_bars()