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;
113 MEM_mallocN(
sizeof(*chunk) + (queue->elem_size * queue->chunk_elem_max), __func__));
116 chunk->
next =
nullptr;
118 if (queue->chunk_last ==
nullptr) {
119 queue->chunk_first = chunk;
122 queue->chunk_last->
next = chunk;
125 queue->chunk_last = chunk;
126 queue->chunk_last_index = 0;
129 BLI_assert(queue->chunk_last_index < queue->chunk_elem_max);
140 queue->chunk_first_index++;
143 if (
UNLIKELY(queue->chunk_first_index == queue->chunk_elem_max || queue->elem_num == 0)) {
146 queue->chunk_first = queue->chunk_first->
next;
147 queue->chunk_first_index = 0;
148 if (queue->chunk_first ==
nullptr) {
149 queue->chunk_last =
nullptr;
150 queue->chunk_last_index = queue->chunk_elem_max - 1;
153 chunk_free->
next = queue->chunk_free;
154 queue->chunk_free = chunk_free;
160 return queue->elem_num;
165 return (queue->chunk_first ==
nullptr);
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)
static void queue_free_chunk(QueueChunk *data)
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)
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_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)