22#define CHUNK_SIZE_DEFAULT (1 << 16)
24#define CHUNK_ELEM_MIN 32
44 return ((
char *)(queue)->chunk_first->data) + ((queue)->elem_size * (queue)->chunk_first_index);
49 return ((
char *)(queue)->chunk_last->data) + ((queue)->elem_size * (queue)->chunk_last_index);
60 BLI_assert((elem_size != 0) && (chunk_size != 0));
62 while (
UNLIKELY(chunk_size <= elem_size_min)) {
69 return chunk_size / elem_size;
77 queue->elem_size = elem_size;
79 queue->chunk_last_index = queue->chunk_elem_max - 1;
102 queue->chunk_last_index++;
105 if (
UNLIKELY(queue->chunk_last_index == queue->chunk_elem_max)) {
107 if (queue->chunk_free) {
108 chunk = queue->chunk_free;
109 queue->chunk_free = chunk->
next;
112 chunk =
MEM_mallocN(
sizeof(*chunk) + (queue->elem_size * queue->chunk_elem_max), __func__);
117 if (queue->chunk_last ==
NULL) {
118 queue->chunk_first = chunk;
121 queue->chunk_last->
next = chunk;
124 queue->chunk_last = chunk;
125 queue->chunk_last_index = 0;
128 BLI_assert(queue->chunk_last_index < queue->chunk_elem_max);
139 queue->chunk_first_index++;
142 if (
UNLIKELY(queue->chunk_first_index == queue->chunk_elem_max || queue->elem_num == 0)) {
143 struct QueueChunk *chunk_free = queue->chunk_first;
145 queue->chunk_first = queue->chunk_first->
next;
146 queue->chunk_first_index = 0;
147 if (queue->chunk_first ==
NULL) {
148 queue->chunk_last =
NULL;
149 queue->chunk_last_index = queue->chunk_elem_max - 1;
152 chunk_free->
next = queue->chunk_free;
153 queue->chunk_free = chunk_free;
159 return queue->elem_num;
164 return (queue->chunk_first ==
NULL);
Read Guarded memory(de)allocation.
#define MEM_SIZE_OVERHEAD
void BLI_gsqueue_free(GSQueue *queue)
static void * queue_get_first_elem(GSQueue *queue)
void BLI_gsqueue_push(GSQueue *queue, const void *item)
void BLI_gsqueue_pop(GSQueue *queue, void *r_item)
GSQueue * BLI_gsqueue_new(const size_t elem_size)
static void * queue_get_last_elem(GSQueue *queue)
static void queue_free_chunk(struct QueueChunk *data)
bool BLI_gsqueue_is_empty(const GSQueue *queue)
static size_t queue_chunk_elem_max_calc(const size_t elem_size, size_t chunk_size)
#define CHUNK_SIZE_DEFAULT
size_t BLI_gsqueue_len(const GSQueue *queue)
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
struct QueueChunk * chunk_free
struct QueueChunk * chunk_last
struct QueueChunk * chunk_first