Use one global task scheduler for all the tasks
authorSergey Sharybin <sergey.vfx@gmail.com>
Wed, 31 Jul 2013 21:55:36 +0000 (21:55 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 31 Jul 2013 21:55:36 +0000 (21:55 +0000)
commitc847198a7b136f48951ae0e788be347d7eb048cf
tree0c310ccff06fae37cee07cbbed46e5e720e7f6ba
parent853f2e05c8b98b9bb1145d2de31a5c646f83a1b2
Use one global task scheduler for all the tasks

Instead of allocating scheduler and starting threads
on every object_update call make it so scheduler is
global and threads are always ready to run.

This was we could avoid quite hacky thing which is
counting how much objects need to be updated before
starting threaded update.

It'll also allow using the same scheduler to do all
sorts of tasks, not only objects update in the same
scheduler. This is nice from load balancing point of
view.

Couple of changes were needed to be done in task
scheduler itself:

- Free tas before sending notifier.
- Free TaskThread structures outside from thread.

This is needed to make it possible use begin/end
threaded malloc from the main thread before/after
running the pool. Without this change it was possible
that allocation will switch to non-thread mode while
thread is freeing the task.

This required storing TaskThread array in Scheduler,
but it's not so much bad actually, since it also
reduces memory overhead caused by per-thread allocation.
source/blender/blenkernel/intern/scene.c
source/blender/blenlib/BLI_threads.h
source/blender/blenlib/intern/task.c
source/blender/blenlib/intern/threads.c
source/blender/windowmanager/intern/wm_init_exit.c