4 * Very simple linked-list based malloc()/free().
10 static struct free_arena_header
*__free_block(struct free_arena_header
*ah
)
12 struct free_arena_header
*pah
, *nah
;
16 if (pah
->a
.type
== ARENA_TYPE_FREE
&&
17 (char *)pah
+ pah
->a
.size
== (char *)ah
) {
18 /* Coalesce into the previous block */
19 pah
->a
.size
+= ah
->a
.size
;
24 ah
->a
.type
= ARENA_TYPE_DEAD
;
30 /* Need to add this block to the free chain */
31 ah
->a
.type
= ARENA_TYPE_FREE
;
33 ah
->next_free
= __malloc_head
.next_free
;
34 ah
->prev_free
= &__malloc_head
;
35 __malloc_head
.next_free
= ah
;
36 ah
->next_free
->prev_free
= ah
;
39 /* In either of the previous cases, we might be able to merge
40 with the subsequent block... */
41 if (nah
->a
.type
== ARENA_TYPE_FREE
&&
42 (char *)ah
+ ah
->a
.size
== (char *)nah
) {
43 ah
->a
.size
+= nah
->a
.size
;
45 /* Remove the old block from the chains */
46 nah
->next_free
->prev_free
= nah
->prev_free
;
47 nah
->prev_free
->next_free
= nah
->next_free
;
48 ah
->a
.next
= nah
->a
.next
;
49 nah
->a
.next
->a
.prev
= ah
;
52 nah
->a
.type
= ARENA_TYPE_DEAD
;
56 /* Return the block that contains the called block */
61 * This is used to insert a block which is not previously on the
62 * free list. Only the a.size field of the arena header is assumed
65 void __inject_free_block(struct free_arena_header
*ah
)
67 struct free_arena_header
*nah
;
68 size_t a_end
= (size_t) ah
+ ah
->a
.size
;
71 for (nah
= __malloc_head
.a
.next
; nah
->a
.type
!= ARENA_TYPE_HEAD
;
73 n_end
= (size_t) nah
+ nah
->a
.size
;
75 /* Is nah entirely beyond this block? */
76 if ((size_t) nah
>= a_end
)
79 /* Is this block entirely beyond nah? */
80 if ((size_t) ah
>= n_end
)
83 /* Otherwise we have some sort of overlap - reject this block */
87 /* Now, nah should point to the successor block */
89 ah
->a
.prev
= nah
->a
.prev
;
91 ah
->a
.prev
->a
.next
= ah
;
98 struct free_arena_header
*ah
;
103 ah
= (struct free_arena_header
*)
104 ((struct arena_header
*)ptr
- 1);
107 assert(ah
->a
.type
== ARENA_TYPE_USED
);
112 /* Here we could insert code to return memory to the system. */