Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2012-11-06 19:54:04 +0400
committerTon Roosendaal <ton@blender.org>2012-11-06 19:54:04 +0400
commit7b60529517d2fb70606da54a27bd05e73dd657f0 (patch)
tree678193166aaa1f15a962fb3f196a1a1ed433f31d /source/blender/windowmanager/intern/wm_jobs.c
parentacc8c654fc83373b3ef98247cd3c2a1e1d23a168 (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/intern/wm_jobs.c')
-rw-r--r--source/blender/windowmanager/intern/wm_jobs.c26
1 files changed, 15 insertions, 11 deletions
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;