[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53503] trunk/blender/source/blender: extend BLI_buffer

Campbell Barton ideasman42 at gmail.com
Wed Jan 2 06:00:10 CET 2013


Revision: 53503
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53503
Author:   campbellbarton
Date:     2013-01-02 05:00:02 +0000 (Wed, 02 Jan 2013)
Log Message:
-----------
extend BLI_buffer
- add option to calloc or not, existing code wasnt consistent here, would calloc on first alloc but not on realloc, also - the static memory was never zero'd.
  use flag BLI_BUFFER_USE_CALLOC to ensure all new memory is zero'd (static/alloc/realloc's).

- add BLI_buffer_declare_static / BLI_buffer_declare so its possible to have a buffer that never uses static memory.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c
    trunk/blender/source/blender/blenlib/BLI_buffer.h
    trunk/blender/source/blender/blenlib/intern/buffer.c

Modified: trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c	2013-01-02 02:12:10 UTC (rev 53502)
+++ trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c	2013-01-02 05:00:02 UTC (rev 53503)
@@ -1040,8 +1040,9 @@
 int BKE_pbvh_bmesh_update_topology(PBVH *bvh, PBVHTopologyUpdateMode mode,
 								   const float center[3], float radius)
 {
-	BLI_buffer_declare(BMFace*, edge_faces, 8);
-	BLI_buffer_declare(BMFace*, deleted_faces, 32);
+	BLI_buffer_declare_static(BMFace *, edge_faces, BLI_BUFFER_NOP, 8);
+	BLI_buffer_declare_static(BMFace *, deleted_faces, BLI_BUFFER_NOP, 32);
+
 	int modified = FALSE;
 	int n;
 

Modified: trunk/blender/source/blender/blenlib/BLI_buffer.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_buffer.h	2013-01-02 02:12:10 UTC (rev 53502)
+++ trunk/blender/source/blender/blenlib/BLI_buffer.h	2013-01-02 05:00:02 UTC (rev 53503)
@@ -28,7 +28,7 @@
 /* Usage examples:
  *
  * { 
- *     BLI_buffer_declare(int, my_int_array, 32);
+ *     BLI_buffer_declare_static(int, my_int_array, BLI_BUFFER_NOP, 32);
  *
  *     BLI_buffer_append(my_int_array, int, 42);
  *     assert(my_int_array.count == 1);
@@ -42,23 +42,43 @@
 	void *data;
 	const int elem_size;
 	int count, alloc_count;
-	int using_static;
+	int flag;
 } BLI_Buffer;
 
-#define BLI_buffer_declare(type_, name_, static_count_) \
+enum {
+	BLI_BUFFER_NOP        = 0,
+	BLI_BUFFER_USE_STATIC = (1 << 0),
+	BLI_BUFFER_USE_CALLOC = (1 << 1),  /* ensure the array is always calloc'd */
+};
+
+#define BLI_buffer_declare_static(type_, name_, flag_, static_count_) \
 	type_ *name_ ## _static_[static_count_]; \
-	BLI_Buffer name_ = {name_ ## _static_, \
-						sizeof(type_), \
-						0, \
-						static_count_, \
-						TRUE}
+	BLI_Buffer name_ = { \
+	/* clear the static memory if this is a calloc'd array */ \
+	((void)((flag_ & BLI_BUFFER_USE_CALLOC) ? \
+	          memset(name_ ## _static_, 0, sizeof(name_ ## _static_)) : 0\
+	), /* memset-end */ \
+	                    name_ ## _static_), \
+	                    sizeof(type_), \
+	                    0, \
+	                    static_count_, \
+	                    BLI_BUFFER_USE_STATIC | flag_}
 
+/* never use static*/
+#define BLI_buffer_declare(type_, name_, flag_) \
+	BLI_Buffer name_ = {NULL, \
+	                    sizeof(type_), \
+	                    0, \
+	                    0, \
+	                    flag_}
+
 #define BLI_buffer_at(buffer_, type_, index_) \
 	(((type_*)(buffer_)->data)[index_])
 
-#define BLI_buffer_append(buffer_, type_, val_) \
+#define BLI_buffer_append(buffer_, type_, val_)  { \
 	BLI_buffer_resize(buffer_, (buffer_)->count + 1); \
-	BLI_buffer_at(buffer_, type_, (buffer_)->count - 1) = val_
+	BLI_buffer_at(buffer_, type_, (buffer_)->count - 1) = val_; \
+} (void)0
 
 /* Never decreases the amount of memory allocated */
 void BLI_buffer_resize(BLI_Buffer *buffer, int new_count);
@@ -66,4 +86,4 @@
 /* Does not free the buffer structure itself */
 void BLI_buffer_free(BLI_Buffer *buffer);
 
-#endif
+#endif  /* __BLI_BUFFER_H__ */

Modified: trunk/blender/source/blender/blenlib/intern/buffer.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/buffer.c	2013-01-02 02:12:10 UTC (rev 53502)
+++ trunk/blender/source/blender/blenlib/intern/buffer.c	2013-01-02 05:00:02 UTC (rev 53503)
@@ -25,25 +25,45 @@
 
 #include <string.h>
 
+static void *buffer_alloc(BLI_Buffer *buffer, int len)
+{
+	return ((buffer->flag & BLI_BUFFER_USE_CALLOC) ?
+	        MEM_callocN : MEM_mallocN)
+	        (buffer->elem_size * len, "BLI_Buffer.data");
+}
+
+static void *buffer_realloc(BLI_Buffer *buffer, int len)
+{
+	return ((buffer->flag & BLI_BUFFER_USE_CALLOC) ?
+	        MEM_recallocN : MEM_reallocN)
+	        (buffer->data, (buffer->elem_size * len));
+}
+
 void BLI_buffer_resize(BLI_Buffer *buffer, int new_count)
 {
 	if (new_count > buffer->alloc_count) {
-		if (buffer->using_static) {
+		if (buffer->flag & BLI_BUFFER_USE_STATIC) {
 			void *orig = buffer->data;
-			buffer->data = MEM_callocN(buffer->elem_size * new_count,
-									   "BLI_Buffer.data");
+
+			buffer->data = buffer_alloc(buffer, new_count);
 			memcpy(buffer->data, orig, buffer->elem_size * buffer->count);
 			buffer->alloc_count = new_count;
-			buffer->using_static = FALSE;
+			buffer->flag &= ~BLI_BUFFER_USE_STATIC;
 		}
 		else {
-			if (new_count < buffer->alloc_count * 2)
+			if (buffer->alloc_count && (new_count < buffer->alloc_count * 2)) {
 				buffer->alloc_count *= 2;
-			else
+			}
+			else {
 				buffer->alloc_count = new_count;
-			buffer->data = MEM_reallocN(buffer->data,
-										(buffer->elem_size *
-										 buffer->alloc_count));
+			}
+
+			if (buffer->data) {
+				buffer->data = buffer_realloc(buffer, buffer->alloc_count);
+			}
+			else {
+				buffer->data = buffer_alloc(buffer, buffer->alloc_count);
+			}
 		}
 	}
 
@@ -52,7 +72,10 @@
 
 void BLI_buffer_free(BLI_Buffer *buffer)
 {
-	if (!buffer->using_static)
-		MEM_freeN(buffer->data);
+	if ((buffer->flag & BLI_BUFFER_USE_STATIC) == 0) {
+		if (buffer->data) {
+			MEM_freeN(buffer->data);
+		}
+	}
 	memset(buffer, 0, sizeof(*buffer));
 }




More information about the Bf-blender-cvs mailing list