diff options
author | Ton Roosendaal <ton@blender.org> | 2012-11-06 19:54:04 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2012-11-06 19:54:04 +0400 |
commit | 7b60529517d2fb70606da54a27bd05e73dd657f0 (patch) | |
tree | 678193166aaa1f15a962fb3f196a1a1ed433f31d /source/blender/windowmanager | |
parent | acc8c654fc83373b3ef98247cd3c2a1e1d23a168 (diff) |
Bugfix #33092
Fluid sim would stop or crash with node editor.
Bug was a real bad one - the code for giving out WM jobs was messed up for long.
It was giving a running fluid job to the compositer even... tsk!
I will go over jobs code carefully next days to see if it all behaves. Now it
allows per owner multiple jobs, provided it has different job_type set.
Also fixed: preview renders (material) were deadslow once a while - caused
by icon render setting miniature tile render sizes. Now it's fast again,
but there are still 3 icon jobs running per UI change... need to check what.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 4 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_jobs.c | 26 |
2 files changed, 17 insertions, 13 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index b9a4e720230..549ded6ee48 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -320,9 +320,9 @@ enum { WM_JOB_SUSPEND = (1 << 3) }; -/* identifying jobs by owner alone is unreliable, this isnt saved, order can change */ +/* identifying jobs by owner alone is unreliable, this isnt saved, order can change (keep 0 for 'any') */ enum { - WM_JOB_TYPE_ANY = -1, + WM_JOB_TYPE_ANY = 0, WM_JOB_TYPE_COMPOSITE, WM_JOB_TYPE_RENDER, WM_JOB_TYPE_RENDER_PREVIEW, /* UI preview */ diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c index 42d721327b6..836df466f0b 100644 --- a/source/blender/windowmanager/intern/wm_jobs.c +++ b/source/blender/windowmanager/intern/wm_jobs.c @@ -131,31 +131,34 @@ struct wmJob { }; /* finds: - * 1st priority: job with same owner and name - * 2nd priority: job with same owner + * if type, compare for it, otherwise any matching job */ -static wmJob *wm_job_find(wmWindowManager *wm, void *owner, const char *name) +static wmJob *wm_job_find(wmWindowManager *wm, void *owner, const int job_type) { - wmJob *wm_job, *found = NULL; + wmJob *wm_job; for (wm_job = wm->jobs.first; wm_job; wm_job = wm_job->next) if (wm_job->owner == owner) { - found = wm_job; - if (name && strcmp(wm_job->name, name) == 0) + + if (job_type) { + if ( wm_job->job_type == job_type) + return wm_job; + } + else return wm_job; } - return found; + return NULL; } /* ******************* public API ***************** */ /* returns current or adds new job, but doesnt run it */ -/* every owner only gets a single job, adding a new one will stop running stop and +/* every owner only gets a single job, adding a new one will stop running job and * when stopped it starts the new one */ wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner, const char *name, int flag, int job_type) { - wmJob *wm_job = wm_job_find(wm, owner, name); + wmJob *wm_job = wm_job_find(wm, owner, job_type); if (wm_job == NULL) { wm_job = MEM_callocN(sizeof(wmJob), "new job"); @@ -167,6 +170,7 @@ wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner, const char * wm_job->job_type = job_type; BLI_strncpy(wm_job->name, name, sizeof(wm_job->name)); } + /* else: a running job, be careful */ return wm_job; } @@ -192,7 +196,7 @@ int WM_jobs_test(wmWindowManager *wm, void *owner, int job_type) float WM_jobs_progress(wmWindowManager *wm, void *owner) { - wmJob *wm_job = wm_job_find(wm, owner, NULL); + wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY); if (wm_job && wm_job->flag & WM_JOB_PROGRESS) return wm_job->progress; @@ -202,7 +206,7 @@ float WM_jobs_progress(wmWindowManager *wm, void *owner) char *WM_jobs_name(wmWindowManager *wm, void *owner) { - wmJob *wm_job = wm_job_find(wm, owner, NULL); + wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY); if (wm_job) return wm_job->name; |