[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59329] trunk/blender/source/blender/ blenlib: add BLI_memarena_clear function to reset a memarena, keeping the last allocated block for more efficient reuse.

Campbell Barton ideasman42 at gmail.com
Tue Aug 20 18:56:47 CEST 2013


Revision: 59329
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59329
Author:   campbellbarton
Date:     2013-08-20 16:56:46 +0000 (Tue, 20 Aug 2013)
Log Message:
-----------
add BLI_memarena_clear function to reset a memarena, keeping the last allocated block for more efficient reuse.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_memarena.h
    trunk/blender/source/blender/blenlib/intern/BLI_memarena.c

Modified: trunk/blender/source/blender/blenlib/BLI_memarena.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_memarena.h	2013-08-20 15:33:36 UTC (rev 59328)
+++ trunk/blender/source/blender/blenlib/BLI_memarena.h	2013-08-20 16:56:46 UTC (rev 59329)
@@ -93,10 +93,14 @@
 #endif
 ;
 
+void BLI_memarena_clear(MemArena *ma)
+#if MEM_GNU_ATTRIBUTES
+__attribute__((nonnull(1)))
+#endif
+;
+
 #ifdef __cplusplus
 }
 #endif
 
-
-#endif
-
+#endif  /* __BLI_MEMARENA_H__ */

Modified: trunk/blender/source/blender/blenlib/intern/BLI_memarena.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/BLI_memarena.c	2013-08-20 15:33:36 UTC (rev 59328)
+++ trunk/blender/source/blender/blenlib/intern/BLI_memarena.c	2013-08-20 16:56:46 UTC (rev 59329)
@@ -30,6 +30,8 @@
  *  \ingroup bli
  */
 
+#include <string.h>
+
 #include "MEM_guardedalloc.h"
 
 #include "BLI_memarena.h"
@@ -89,6 +91,16 @@
 /* amt must be power of two */
 #define PADUP(num, amt) (((num) + ((amt) - 1)) & ~((amt) - 1))
 
+/* align alloc'ed memory (needed if align > 8) */
+static void memarena_curbuf_align(MemArena *ma)
+{
+	unsigned char *tmp;
+
+	tmp = (unsigned char *)PADUP( (intptr_t) ma->curbuf, ma->align);
+	ma->cursize -= (int)(tmp - ma->curbuf);
+	ma->curbuf = tmp;
+}
+
 void *BLI_memarena_alloc(MemArena *ma, int size)
 {
 	void *ptr;
@@ -98,8 +110,6 @@
 	size = PADUP(size, ma->align);
 
 	if (size > ma->cursize) {
-		unsigned char *tmp;
-
 		if (size > ma->bufsize - (ma->align - 1)) {
 			ma->cursize = PADUP(size + 1, ma->align);
 		}
@@ -112,11 +122,7 @@
 			ma->curbuf = MEM_mallocN((size_t)ma->cursize, ma->name);
 
 		BLI_linklist_prepend(&ma->bufs, ma->curbuf);
-
-		/* align alloc'ed memory (needed if align > 8) */
-		tmp = (unsigned char *)PADUP( (intptr_t) ma->curbuf, ma->align);
-		ma->cursize -= (int)(tmp - ma->curbuf);
-		ma->curbuf = tmp;
+		memarena_curbuf_align(ma);
 	}
 
 	ptr = ma->curbuf;
@@ -125,3 +131,32 @@
 
 	return ptr;
 }
+
+/**
+ * Clear for reuse, avoids re-allocation when an arena may
+ * otherwise be free'd and recreated.
+ */
+void BLI_memarena_clear(MemArena *ma)
+{
+	if (ma->bufs) {
+		unsigned char *curbuf_prev;
+		int curbuf_used;
+
+		if (ma->bufs->next) {
+			BLI_linklist_freeN(ma->bufs->next);
+			ma->bufs->next = NULL;
+		}
+
+		curbuf_prev = ma->curbuf;
+		ma->curbuf = ma->bufs->link;
+		memarena_curbuf_align(ma);
+
+		/* restore to original size */
+		curbuf_used = (int)(curbuf_prev - ma->curbuf);
+		ma->cursize += curbuf_used;
+
+		if (ma->use_calloc) {
+			memset(ma->curbuf, 0, (size_t)curbuf_used);
+		}
+	}
+}




More information about the Bf-blender-cvs mailing list