Rev 817 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 817 | Rev 829 | ||
---|---|---|---|
Line 40... | Line 40... | ||
40 | */ |
40 | */ |
Line 41... | Line 41... | ||
41 | 41 | ||
42 | struct mem_block { |
42 | struct mem_block { |
43 | struct mem_block *next; |
43 | struct mem_block *next; |
44 | struct mem_block *prev; |
44 | struct mem_block *prev; |
45 | int start; |
45 | u32_t start; |
46 | int size; |
46 | size_t size; |
Line 47... | Line 47... | ||
47 | }; |
47 | }; |
48 | 48 | ||
49 | /* Initialize. How to check for an uninitialized heap? |
49 | /* Initialize. How to check for an uninitialized heap? |
50 | */ |
50 | */ |
51 | static int init_heap(struct mem_block **heap, int start, int size) |
51 | static int init_heap(struct mem_block **heap, int start, int size) |
Line 52... | Line 52... | ||
52 | { |
52 | { |
53 | struct mem_block *blocks = kmalloc(sizeof(*blocks)); |
53 | struct mem_block *blocks = malloc(sizeof(*blocks)); |
Line 54... | Line 54... | ||
54 | 54 | ||
55 | if (!blocks) |
55 | if (!blocks) |
56 | return -1; //-ENOMEM; |
56 | return -1; //-ENOMEM; |
57 | 57 | ||
58 | *heap = kmalloc(sizeof(**heap)); |
58 | *heap = malloc(sizeof(**heap)); |
59 | if (!*heap) |
59 | if (!*heap) |
Line 60... | Line 60... | ||
60 | { |
60 | { |
61 | kfree(blocks); |
61 | free(blocks); |
62 | return -1; //-ENOMEM; |
62 | return -1; //-ENOMEM; |
Line 63... | Line 63... | ||
63 | } |
63 | } |
64 | 64 | ||
- | 65 | blocks->start = start; |
|
65 | blocks->start = start; |
66 | blocks->size = size; |
66 | blocks->size = size; |
67 | blocks->next = blocks->prev = *heap; |
Line 67... | Line 68... | ||
67 | blocks->next = blocks->prev = *heap; |
68 | |
68 | 69 | __clear(*heap,sizeof(**heap)); |
|
Line 88... | Line 89... | ||
88 | { |
89 | { |
Line 89... | Line 90... | ||
89 | 90 | ||
90 | /* Maybe cut off the end of an existing block */ |
91 | /* Maybe cut off the end of an existing block */ |
91 | if (size < p->size) |
92 | if (size < p->size) |
92 | { |
93 | { |
93 | struct mem_block *newblock = kmalloc(sizeof(*newblock)); |
94 | struct mem_block *newblock = malloc(sizeof(*newblock)); |
94 | if (!newblock) |
95 | if (!newblock) |
95 | goto out; |
96 | goto out; |
96 | newblock->start = p->start + size; |
97 | newblock->start = p->start + size; |
97 | newblock->size = p->size - size; |
98 | newblock->size = p->size - size; |
98 | newblock->next = p->next; |
99 | newblock->next = p->next; |
99 | newblock->prev = p; |
100 | newblock->prev = p; |
100 | p->next->prev = newblock; |
101 | p->next->prev = newblock; |
101 | p->next = newblock; |
102 | p->next = newblock; |
102 | p->size = size; |
103 | p->size = size; |
103 | p->start|=1; |
104 | p->start|=USED_BLOCK; |
Line 104... | Line 105... | ||
104 | } |
105 | } |
105 | 106 | ||
106 | out: |
107 | out: |
Line 111... | Line 112... | ||
111 | { |
112 | { |
112 | struct mem_block *p; |
113 | struct mem_block *p; |
Line 113... | Line 114... | ||
113 | 114 | ||
114 | list_for_each(p, heap) |
115 | list_for_each(p, heap) |
- | 116 | { |
|
115 | { |
117 | |
116 | if ( !(p->start & USED_BLOCK) && size <= p->size) |
118 | if ( !(p->start & USED_BLOCK) && size <= p->size) |
117 | return split_block(p, size); |
119 | return split_block(p, size); |
Line 118... | Line 120... | ||
118 | } |
120 | } |
Line 126... | Line 128... | ||
126 | struct mem_block *p; |
128 | struct mem_block *p; |
Line 127... | Line 129... | ||
127 | 129 | ||
128 | list_for_each(p, heap) |
130 | list_for_each(p, heap) |
129 | if ((p->start & ~USED_BLOCK) == start) |
131 | if ((p->start & ~USED_BLOCK) == start) |
130 | return p; |
- | |
131 | 132 | return p; |
|
132 | return NULL; |
133 | return NULL; |
Line 133... | Line 134... | ||
133 | } |
134 | } |
134 | 135 | ||
Line 145... | Line 146... | ||
145 | { |
146 | { |
146 | struct mem_block *q = p->next; |
147 | struct mem_block *q = p->next; |
147 | p->size += q->size; |
148 | p->size += q->size; |
148 | p->next = q->next; |
149 | p->next = q->next; |
149 | p->next->prev = p; |
150 | p->next->prev = p; |
150 | kfree(q); |
151 | free(q); |
151 | } |
152 | } |
Line 152... | Line 153... | ||
152 | 153 | ||
153 | if ( !(p->prev->start & USED_BLOCK)) |
154 | if ( !(p->prev->start & USED_BLOCK)) |
154 | { |
155 | { |
155 | struct mem_block *q = p->prev; |
156 | struct mem_block *q = p->prev; |
156 | q->size += p->size; |
157 | q->size += p->size; |
157 | q->next = p->next; |
158 | q->next = p->next; |
158 | q->next->prev = q; |
159 | q->next->prev = q; |
159 | kfree(p); |
160 | free(p); |
160 | } |
161 | } |
Line 161... | Line 162... | ||
161 | } |
162 | } |
162 | 163 | ||
Line 199... | Line 200... | ||
199 | 200 | ||
200 | block = find_block(*heap, (int)offset); |
201 | block = find_block(*heap, (int)offset); |
201 | if (!block) |
202 | if (!block) |
Line 202... | Line 203... | ||
202 | return -1; |
203 | return -1; |
203 | 204 | ||
Line 204... | Line 205... | ||
204 | if ( !(block->start & 1)) |
205 | if ( !(block->start & USED_BLOCK)) |
205 | return -1; |
206 | return -1; |
206 | 207 | ||
Line -... | Line 208... | ||
- | 208 | free_block(block); |
|
- | 209 | return 0; |
|
- | 210 | } |
|
- | 211 | ||
- | 212 | void dump_mem() |
|
- | 213 | { |
|
- | 214 | struct mem_block *p; |
|
- | 215 | struct mem_block **heap; |
|
- | 216 | ||
- | 217 | heap = &rhd.fb_heap; |
|
- | 218 | ||
- | 219 | list_for_each(p, *heap) |
|
- | 220 | { |