23 #define CAN_BE_MERGED(prev, next) \
24 ((struct chunk*)(((struct chunk*)(prev))->ptr + ((struct chunk*)(prev))->size) == next)
26 #define ALIGNED(align, size) \
27 ((uint32_t)((uint32_t)(size) + ((align) - ((uint32_t)(size) & ((align) - 1)))))
42 static struct chunk_stat {
69 item = (
struct chunk*)base;
70 item->
size = size -
sizeof(*item);
72 s_stat.base = (
unsigned long)base;
73 s_stat.size.total = item->size;
76 list_add_tail(&item->head, &__free);
85 register int internal_fragment;
93 chunk_size = size +
sizeof(*item);
99 internal_fragment = item->size - chunk_size;
100 if (internal_fragment < 0) {
104 if (internal_fragment <=
sizeof(*item)) {
107 struct chunk *new_item;
119 item->
size -= chunk_size;
120 new_item = (
struct chunk *)(item->ptr + item->size);
124 s_stat.size.used += chunk_size;
127 list_add_tail(&item->head, &__used);
171 register int internal_fragment;
183 chunk_size += size +
sizeof(*item);
185 internal_fragment = item->
size - chunk_size;
186 if (internal_fragment < 0) {
190 if (internal_fragment <=
sizeof(*item)) {
193 struct chunk *new_item;
195 item->
size -= chunk_size;
200 s_stat.size.used += chunk_size;
203 list_add_tail(&item->
head, &__used);
234 item = find_item(ptr, align);
241 list_del(&item->head);
243 s_stat.size.used -= (item->size +
sizeof(*item));
251 item->size += tmp->
size +
sizeof(*tmp);
255 item->head = tmp->
head;
282 tmp->
size += item->size +
sizeof(*item);
300 unsigned long boundary;
307 total = (
unsigned long)ptr - s_stat.base;
308 if (s_stat.size.used > total) {
314 boundary = s_stat.base + s_stat.size.total;
317 if (((
unsigned long)item + item->
size) == boundary) {
319 tmp = item->
size + total - s_stat.size.total;
327 s_stat.size.total = total;
332 if ((
unsigned long)ptr <= boundary) {
338 item = (
struct chunk*)boundary;
339 item->
size = (
ssize_t)((
unsigned long)ptr - boundary);
340 item->
size -=
sizeof(*item);
342 list_add_tail(&item->
head, &__free);
352 unsigned long boundary;
359 boundary = s_stat.base + s_stat.size.total;
362 if (((
unsigned long)item + item->
size) == boundary) {
363 if ((item->
size + increment) < 0) {
369 item->
size += increment;
377 item = (
struct chunk*)boundary;
378 item->
size = increment -
sizeof(*item);
379 list_add_tail(&item->head, &__free);
381 boundary += increment;
385 return (
void*)boundary;