Fix #27328: Undoing an operation while baking fluids freezes Blender

Prevent Undo be run if there are any jobs are currently running.
This also makes sense with such jobs as multires baker, for example.
This commit is contained in:
Sergey Sharybin 2011-11-29 15:26:46 +00:00
parent 6a99ebcc72
commit 9c0f557b35
3 changed files with 18 additions and 0 deletions

@ -125,6 +125,12 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
Object *obact= CTX_data_active_object(C);
ScrArea *sa= CTX_wm_area(C);
/* undo during jobs are running can easily lead to freeing data using by jobs,
or they can just lead to freezing job in some other cases */
if(WM_jobs_has_running(CTX_wm_manager(C))) {
return OPERATOR_CANCELLED;
}
/* grease pencil can be can be used in plenty of spaces, so check it first */
if(ED_gpencil_session_active()) {
return ED_undo_gpencil_step(C, step, undoname);

@ -316,6 +316,8 @@ void WM_jobs_stop(struct wmWindowManager *wm, void *owner, void *startjob);
void WM_jobs_kill(struct wmWindowManager *wm, void *owner, void (*)(void *, short int *, short int *, float *));
void WM_jobs_stop_all(struct wmWindowManager *wm);
int WM_jobs_has_running(struct wmWindowManager *wm);
/* clipboard */
char *WM_clipboard_text_get(int selection);
void WM_clipboard_text_set(char *buf, int selection);

@ -505,3 +505,13 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt)
}
}
int WM_jobs_has_running(wmWindowManager *wm)
{
wmJob *steve;
for(steve= wm->jobs.first; steve; steve= steve->next)
if(steve->running)
return 1;
return 0;
}