1 #ifndef CAIRO_TG_ALLOCATOR_H
2 #define CAIRO_TG_ALLOCATOR_H
6 typedef struct _cairo_tg_mem_chunk cairo_tg_mem_chunk_t;
8 struct _cairo_tg_mem_chunk
10 cairo_tg_mem_chunk_t *next;
16 typedef struct _cairo_tg_mono_allocator
18 cairo_tg_mem_chunk_t *chunk_head;
20 } cairo_tg_mono_allocator_t;
22 static inline cairo_tg_mem_chunk_t *
23 _cairo_tg_mem_chunk_create (int chunk_size)
25 cairo_tg_mem_chunk_t *chunk;
27 chunk = (cairo_tg_mem_chunk_t *) malloc (sizeof (cairo_tg_mem_chunk_t) + chunk_size);
32 chunk->buffer = (uint8_t *) chunk + sizeof (cairo_tg_mem_chunk_t);
33 chunk->chunk_size = chunk_size;
34 chunk->remaining_size = chunk_size;
41 _cairo_tg_mem_chunk_destroy (cairo_tg_mem_chunk_t *chunk)
46 static inline cairo_status_t
47 _cairo_tg_mono_allocator_init (cairo_tg_mono_allocator_t *allocator, int chunk_size)
49 cairo_tg_mem_chunk_t *chunk;
51 chunk = _cairo_tg_mem_chunk_create (chunk_size);
54 return CAIRO_STATUS_NO_MEMORY;
56 allocator->chunk_size = chunk_size;
57 allocator->chunk_head = chunk;
59 return CAIRO_STATUS_SUCCESS;
63 _cairo_tg_mono_allocator_fini (cairo_tg_mono_allocator_t *allocator)
65 cairo_tg_mem_chunk_t *chunk = allocator->chunk_head, *next;
70 _cairo_tg_mem_chunk_destroy (chunk);
74 allocator->chunk_head = NULL;
78 _cairo_tg_mono_allocator_alloc (cairo_tg_mono_allocator_t *allocator, int size)
80 cairo_tg_mem_chunk_t *chunk = allocator->chunk_head;
83 if (chunk && chunk->remaining_size >= size)
85 void *buffer = (void*)(chunk->buffer + chunk->chunk_size - chunk->remaining_size);
86 chunk->remaining_size -= size;
90 chunk_size = MAX (allocator->chunk_size, size);
92 chunk = _cairo_tg_mem_chunk_create (chunk_size);
97 chunk->next = allocator->chunk_head;
98 chunk->buffer = (uint8_t *) chunk + sizeof (cairo_tg_mem_chunk_t);
99 chunk->chunk_size = chunk_size;
100 chunk->remaining_size = chunk_size - size;
102 allocator->chunk_head = chunk;
104 return (void *) chunk->buffer;
108 _cairo_tg_mono_allocator_reset (cairo_tg_mono_allocator_t *allocator)
110 cairo_tg_mem_chunk_t *chunk = allocator->chunk_head, *next;
111 cairo_tg_mem_chunk_t *stock = NULL;
113 while (chunk != NULL)
118 _cairo_tg_mem_chunk_destroy (chunk);
128 stock->remaining_size = stock->chunk_size;
131 allocator->chunk_head = stock;
134 #endif /* CAIRO_TG_ALLOCATOR_H */