Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-01-02 09:00:02 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-01-02 09:00:02 +0400
commit9190c493c17b09dc52b96bb46439d03df086ad7c (patch)
treed341cf963257240cdaf53f3e1d0e592a9285aba1 /source/blender/blenlib/intern/buffer.c
parenta8a60c6566c1097355f55d64d9861ed850040a1c (diff)
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.
Diffstat (limited to 'source/blender/blenlib/intern/buffer.c')
-rw-r--r--source/blender/blenlib/intern/buffer.c45
1 files changed, 34 insertions, 11 deletions
diff --git a/source/blender/blenlib/intern/buffer.c b/source/blender/blenlib/intern/buffer.c
index 98151c8eebf..b2280b9a0d1 100644
--- a/source/blender/blenlib/intern/buffer.c
+++ b/source/blender/blenlib/intern/buffer.c
@@ -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_resize(BLI_Buffer *buffer, int new_count)
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));
}