[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60865] trunk/blender/intern/guardedalloc/ intern/mallocn_lockfree_impl.c: Fix for wrong implementation of mmap in lock-free allocator
Sergey Sharybin
sergey.vfx at gmail.com
Sun Oct 20 02:12:55 CEST 2013
Revision: 60865
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60865
Author: nazgul
Date: 2013-10-20 00:12:54 +0000 (Sun, 20 Oct 2013)
Log Message:
-----------
Fix for wrong implementation of mmap in lock-free allocator
- Freeing was not using proper block length
- Duplicating memory block was not aware of
mmaped blocks.
Modified Paths:
--------------
trunk/blender/intern/guardedalloc/intern/mallocn_lockfree_impl.c
Modified: trunk/blender/intern/guardedalloc/intern/mallocn_lockfree_impl.c
===================================================================
--- trunk/blender/intern/guardedalloc/intern/mallocn_lockfree_impl.c 2013-10-19 21:20:50 UTC (rev 60864)
+++ trunk/blender/intern/guardedalloc/intern/mallocn_lockfree_impl.c 2013-10-20 00:12:54 UTC (rev 60865)
@@ -61,6 +61,7 @@
#define MEMHEAD_FROM_PTR(ptr) (((MemHead*) vmemh) - 1)
#define PTR_FROM_MEMHEAD(memhead) (memhead + 1)
+#define MEMHEAD_IS_MMAP(memhead) ((memhead)->len & (size_t) 1)
#ifdef __GNUC__
__attribute__ ((format(printf, 1, 2)))
@@ -112,13 +113,13 @@
atomic_sub_u(&totblock, 1);
atomic_sub_z(&mem_in_use, len);
- if (memh->len & (size_t) 1) {
+ if (MEMHEAD_IS_MMAP(memh)) {
atomic_sub_z(&mmap_in_use, len);
#if defined(WIN32)
/* our windows mmap implementation is not thread safe */
mem_lock_thread();
#endif
- if (munmap(memh, memh->len + sizeof(MemHead)))
+ if (munmap(memh, len + sizeof(MemHead)))
printf("Couldn't unmap memory\n");
#if defined(WIN32)
mem_unlock_thread();
@@ -136,8 +137,14 @@
{
void *newp = NULL;
if (vmemh) {
+ MemHead *memh = MEMHEAD_FROM_PTR(vmemh);
const size_t prev_size = MEM_allocN_len(vmemh);
- newp = MEM_lockfree_mallocN(prev_size, "dupli_malloc");
+ if (MEMHEAD_IS_MMAP(memh)) {
+ newp = MEM_lockfree_mapallocN(prev_size, "dupli_mapalloc");
+ }
+ else {
+ newp = MEM_lockfree_mallocN(prev_size, "dupli_malloc");
+ }
memcpy(newp, vmemh, prev_size);
}
return newp;
More information about the Bf-blender-cvs
mailing list