[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