[Bf-blender-cvs] [980d1d55271] greasepencil-refactor: BLI_memblock: Fix BLI_memblock_destroy not freeing all elements

Clément Foucault noreply at git.blender.org
Tue Dec 10 02:27:41 CET 2019


Commit: 980d1d55271ff5e327dbdde3d35fbe4904d53854
Author: Clément Foucault
Date:   Tue Dec 10 01:36:49 2019 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rB980d1d55271ff5e327dbdde3d35fbe4904d53854

BLI_memblock: Fix BLI_memblock_destroy not freeing all elements

This was happening if BLI_memblock_destroy was called on a memblock that
has not been cleared first.

===================================================================

M	source/blender/blenlib/intern/BLI_memblock.c

===================================================================

diff --git a/source/blender/blenlib/intern/BLI_memblock.c b/source/blender/blenlib/intern/BLI_memblock.c
index f7239f1b9d1..ee9ea15835b 100644
--- a/source/blender/blenlib/intern/BLI_memblock.c
+++ b/source/blender/blenlib/intern/BLI_memblock.c
@@ -81,7 +81,16 @@ BLI_memblock *BLI_memblock_create_ex(uint elem_size, uint chunk_size)
 
 void BLI_memblock_destroy(BLI_memblock *mblk, MemblockValFreeFP free_callback)
 {
-  BLI_memblock_clear(mblk, free_callback);
+  int elem_per_chunk = mblk->chunk_size / mblk->elem_size;
+
+  if (free_callback) {
+    for (int i = 0; i <= mblk->elem_last; i++) {
+      int chunk_idx = i / elem_per_chunk;
+      int elem_idx = i - elem_per_chunk * chunk_idx;
+      void *val = (char *)(mblk->chunk_list[chunk_idx]) + mblk->elem_size * elem_idx;
+      free_callback(val);
+    }
+  }
 
   for (int i = 0; i < mblk->chunk_len; i++) {
     MEM_SAFE_FREE(mblk->chunk_list[i]);



More information about the Bf-blender-cvs mailing list