[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