diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-08-19 14:51:40 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-08-19 14:51:40 +0400 |
commit | c0f8e15295371ae69b38185d3ee5659cdd1af386 (patch) | |
tree | 7a550dcc6b6e5026efc850be4a69023708379d75 /source/blender | |
parent | efa836531e171028870ee50bcebc4e56a17b536b (diff) |
Speedup for guarded allocator
- Re-arrange locks, so no actual memory allocation
(which is relatively slow) happens from inside
the lock. operation system will take care of locks
which might be needed there on it's own.
- Use spin lock instead of mutex, since it's just
list operations happens from inside lock, no need
in mutex here.
- Use atomic operations for memory in use and total
used blocks counters.
This makes guarded allocator almost the same speed
as non-guarded one in files from Tube project.
There're still MemHead/MemTail overhead which might
be bad for CPU cache utilization
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenlib/BLI_threads.h | 1 | ||||
-rw-r--r-- | source/blender/blenlib/intern/threads.c | 13 | ||||
-rw-r--r-- | source/blender/makesdna/intern/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/makesdna/intern/SConscript | 1 | ||||
-rw-r--r-- | source/blender/makesrna/SConscript | 1 | ||||
-rw-r--r-- | source/blender/makesrna/intern/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_init_exit.c | 3 |
7 files changed, 18 insertions, 3 deletions
diff --git a/source/blender/blenlib/BLI_threads.h b/source/blender/blenlib/BLI_threads.h index 154986936a2..38ad0827246 100644 --- a/source/blender/blenlib/BLI_threads.h +++ b/source/blender/blenlib/BLI_threads.h @@ -50,6 +50,7 @@ struct ListBase; /*this is run once at startup*/ void BLI_threadapi_init(void); +void BLI_threadapi_exit(void); void BLI_init_threads(struct ListBase *threadbase, void *(*do_thread)(void *), int tot); int BLI_available_threads(struct ListBase *threadbase); diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c index 2b6fb52c49c..c8b84d9310a 100644 --- a/source/blender/blenlib/intern/threads.c +++ b/source/blender/blenlib/intern/threads.c @@ -107,7 +107,7 @@ static void *thread_tls_data; * BLI_end_threads(&lb); * ************************************************ */ -static pthread_mutex_t _malloc_lock = PTHREAD_MUTEX_INITIALIZER; +static SpinLock _malloc_lock; static pthread_mutex_t _image_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t _image_draw_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t _viewer_lock = PTHREAD_MUTEX_INITIALIZER; @@ -134,17 +134,24 @@ typedef struct ThreadSlot { static void BLI_lock_malloc_thread(void) { - pthread_mutex_lock(&_malloc_lock); + BLI_spin_lock(&_malloc_lock); } static void BLI_unlock_malloc_thread(void) { - pthread_mutex_unlock(&_malloc_lock); + BLI_spin_unlock(&_malloc_lock); } void BLI_threadapi_init(void) { mainid = pthread_self(); + + BLI_spin_init(&_malloc_lock); +} + +void BLI_threadapi_exit(void) +{ + BLI_spin_end(&_malloc_lock); } /* tot = 0 only initializes malloc mutex in a safe way (see sequence.c) diff --git a/source/blender/makesdna/intern/CMakeLists.txt b/source/blender/makesdna/intern/CMakeLists.txt index 70c79fa393c..f8fa625415e 100644 --- a/source/blender/makesdna/intern/CMakeLists.txt +++ b/source/blender/makesdna/intern/CMakeLists.txt @@ -29,6 +29,7 @@ add_definitions(-DWITH_DNA_GHASH) blender_include_dirs( ../../../../intern/guardedalloc + ../../../../intern/atomic ../../blenlib .. ) diff --git a/source/blender/makesdna/intern/SConscript b/source/blender/makesdna/intern/SConscript index c0db40dcfd2..2ae9b22e61c 100644 --- a/source/blender/makesdna/intern/SConscript +++ b/source/blender/makesdna/intern/SConscript @@ -46,6 +46,7 @@ dna = env.Clone() makesdna_tool.Append(CCFLAGS = '-DBASE_HEADER="\\"source/blender/makesdna/\\"" ') makesdna_tool.Append (CPPPATH = ['#/intern/guardedalloc', + '#/intern/atomic', '../../makesdna', '../../bmesh']) if env['OURPLATFORM'] == 'linuxcross': diff --git a/source/blender/makesrna/SConscript b/source/blender/makesrna/SConscript index 2d0c4260c97..dfe1ebb3385 100644 --- a/source/blender/makesrna/SConscript +++ b/source/blender/makesrna/SConscript @@ -36,6 +36,7 @@ incs = [ '.', './intern', '#/intern/guardedalloc', + '#/intern/atomic', '#/intern/memutil', '#/extern/glew/include', '#/intern/audaspace/intern', diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt index 592c518e9c0..eb0c4f7c422 100644 --- a/source/blender/makesrna/intern/CMakeLists.txt +++ b/source/blender/makesrna/intern/CMakeLists.txt @@ -276,6 +276,7 @@ blender_include_dirs( ../../../../intern/audaspace/intern ../../../../intern/cycles/blender ../../../../intern/guardedalloc + ../../../../intern/atomic ../../../../intern/memutil ../../../../intern/smoke/extern ) diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index 63cf1eeb40d..4e9b849af40 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -51,6 +51,7 @@ #include "BLI_listbase.h" #include "BLI_path_util.h" #include "BLI_string.h" +#include "BLI_threads.h" #include "BLI_utildefines.h" #include "BKE_blender.h" @@ -510,6 +511,8 @@ void WM_exit_ext(bContext *C, const short do_python) GHOST_DisposeSystemPaths(); + BLI_threadapi_exit(); + if (MEM_get_memory_blocks_in_use() != 0) { printf("Error: Not freed memory blocks: %d\n", MEM_get_memory_blocks_in_use()); MEM_printmemlist(); |