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:
-rw-r--r--source/blender/blenlib/BLI_memiter.h4
-rw-r--r--source/blender/blenlib/intern/BLI_memiter.c31
2 files changed, 19 insertions, 16 deletions
diff --git a/source/blender/blenlib/BLI_memiter.h b/source/blender/blenlib/BLI_memiter.h
index 96a47d53984..36877d8f4ba 100644
--- a/source/blender/blenlib/BLI_memiter.h
+++ b/source/blender/blenlib/BLI_memiter.h
@@ -34,7 +34,7 @@ extern "C"
#include "BLI_compiler_compat.h"
/* 512kb, good default for small elems. */
-#define BLI_MEMITER_DEFAULT_SIZE (2 << 18)
+#define BLI_MEMITER_DEFAULT_SIZE (1 << 19)
struct BLI_memiter;
struct BLI_memiter_chunk;
@@ -61,7 +61,7 @@ typedef struct BLI_memiter_handle {
} BLI_memiter_handle;
void BLI_memiter_iter_init(BLI_memiter *mi, BLI_memiter_handle *iter) ATTR_NONNULL();
-bool BLI_memiter_iter_done(BLI_memiter_handle *iter) ATTR_NONNULL();
+bool BLI_memiter_iter_done(const BLI_memiter_handle *iter) ATTR_NONNULL();
void *BLI_memiter_iter_step(BLI_memiter_handle *iter) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
void *BLI_memiter_iter_step_size(BLI_memiter_handle *iter, uint *r_size) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
diff --git a/source/blender/blenlib/intern/BLI_memiter.c b/source/blender/blenlib/intern/BLI_memiter.c
index 4d365680e8a..c86c26f578a 100644
--- a/source/blender/blenlib/intern/BLI_memiter.c
+++ b/source/blender/blenlib/intern/BLI_memiter.c
@@ -82,7 +82,7 @@ typedef struct BLI_memiter_chunk {
} BLI_memiter_chunk;
typedef struct BLI_memiter {
- /* A pointer to 'head' is needed*/
+ /* A pointer to 'head' is needed so we can iterate in the order allocated. */
struct BLI_memiter_chunk *head, *tail;
data_t *data_curr;
data_t *data_last;
@@ -136,7 +136,7 @@ static void memiter_init(BLI_memiter *mi)
*/
BLI_memiter *BLI_memiter_create(uint chunk_size_min)
{
- BLI_memiter *mi = MEM_mallocN(sizeof(BLI_memiter), STRINGIFY(BLI_memiter));
+ BLI_memiter *mi = MEM_mallocN(sizeof(BLI_memiter), "BLI_memiter");
memiter_init(mi);
/* Small values are used for tests to check for correctness,
@@ -172,7 +172,7 @@ void *BLI_memiter_alloc(BLI_memiter *mi, uint elem_size)
BLI_memiter_chunk *chunk = MEM_mallocN(
sizeof(BLI_memiter_chunk) +
(chunk_size * sizeof(data_t)),
- STRINGIFY(BLI_memiter_chunk));
+ "BLI_memiter_chunk");
if (mi->head == NULL) {
BLI_assert(mi->tail == NULL);
@@ -269,7 +269,7 @@ void *BLI_memiter_elem_first(BLI_memiter *mi)
}
}
-void *BLI_memiter_elem_first_size(BLI_memiter *mi, unsigned int *r_size)
+void *BLI_memiter_elem_first_size(BLI_memiter *mi, uint *r_size)
{
if (mi->head != NULL) {
BLI_memiter_chunk *chunk = mi->head;
@@ -303,26 +303,27 @@ void BLI_memiter_iter_init(BLI_memiter *mi, BLI_memiter_handle *iter)
iter->elem_left = mi->count;
}
-bool BLI_memiter_iter_done(BLI_memiter_handle *iter)
+bool BLI_memiter_iter_done(const BLI_memiter_handle *iter)
{
return iter->elem_left != 0;
}
-BLI_INLINE void memiter_iter_step(BLI_memiter_handle *iter)
+BLI_INLINE void memiter_chunk_step(BLI_memiter_handle *iter)
{
- if (UNLIKELY(iter->elem->size < 0)) {
- BLI_memiter_chunk *chunk = (BLI_memiter_chunk *)(((data_t *)iter->elem) + iter->elem->size);
- chunk = chunk->next;
- iter->elem = chunk ? (BLI_memiter_elem *)chunk->data : NULL;
- BLI_assert(iter->elem == NULL || iter->elem->size >= 0);
- }
+ BLI_assert(iter->elem->size < 0);
+ BLI_memiter_chunk *chunk = (BLI_memiter_chunk *)(((data_t *)iter->elem) + iter->elem->size);
+ chunk = chunk->next;
+ iter->elem = chunk ? (BLI_memiter_elem *)chunk->data : NULL;
+ BLI_assert(iter->elem == NULL || iter->elem->size >= 0);
}
void *BLI_memiter_iter_step_size(BLI_memiter_handle *iter, uint *r_size)
{
if (iter->elem_left != 0) {
iter->elem_left -= 1;
- memiter_iter_step(iter);
+ if (UNLIKELY(iter->elem->size < 0)) {
+ memiter_chunk_step(iter);
+ }
BLI_assert(iter->elem->size >= 0);
uint size = (uint)iter->elem->size;
*r_size = size; /* <-- only difference */
@@ -339,7 +340,9 @@ void *BLI_memiter_iter_step(BLI_memiter_handle *iter)
{
if (iter->elem_left != 0) {
iter->elem_left -= 1;
- memiter_iter_step(iter);
+ if (UNLIKELY(iter->elem->size < 0)) {
+ memiter_chunk_step(iter);
+ }
BLI_assert(iter->elem->size >= 0);
uint size = (uint)iter->elem->size;
data_t *data = iter->elem->data;