44#define __MALLOC_MARGIN__ 120
46extern char _pvHeapStart;
47extern char _vStackTop;
48#define __heap_start _pvHeapStart
71#define STACK_POINTER() (&_vStackTop)
73char *__brkval = &__heap_start;
75char *__brkval_maximum = (
char*)100;
85 len = (len + 3) & (~3);
93 if (len <
sizeof(
struct __freelist) -
sizeof(size_t))
94 len =
sizeof(
struct __freelist) - sizeof(size_t);
103 for (s = 0, fp1 = __flp, fp2 = 0;
105 fp2 = fp1, fp1 = fp1->
nx) {
108 if (fp1->
sz == len) {
120 if (s == 0 || fp1->
sz < s) {
161 sfp1->
sz = s -
sizeof(size_t);
174 cp = STACK_POINTER() - __MALLOC_MARGIN__;
180 avail = cp - __brkval;
184 if (avail >= len && avail >= len +
sizeof(
size_t)) {
186 __brkval += len +
sizeof(size_t);
187 __brkval_maximum = __brkval;
202 char *cp1, *cp2, *cpnew;
209 cpnew -=
sizeof(size_t);
219 if ((
char *)p + fpnew->
sz == __brkval)
231 for (fp1 = __flp, fp2 = 0;
233 fp2 = fp1, fp1 = fp1->
nx) {
238 if ((
char *)&(fpnew->
nx) + fpnew->
sz == cp1) {
240 fpnew->
sz += fp1->sz +
sizeof(size_t);
257 cp2 = (
char *)&(fp2->
nx);
258 if (cp2 + fp2->
sz == cpnew) {
260 fp2->
sz += fpnew->
sz +
sizeof(size_t);
266 for (fp1 = __flp, fp2 = 0;
268 fp2 = fp1, fp1 = fp1->
nx)
270 cp2 = (
char *)&(fp1->nx);
271 if (cp2 + fp1->sz == __brkval) {
277 __brkval = cp2 -
sizeof(size_t);
284realloc(
void *ptr,
size_t len)
292 len = (len + 3) & (~3);
299 cp1 -=
sizeof(size_t);
302 cp = (
char *)ptr + len;
314 if (len <= fp1->
sz) {
321 fp2->
sz = fp1->
sz - len -
sizeof(size_t);
331 incr = len - fp1->
sz;
332 cp = (
char *)ptr + fp1->
sz;
334 for (s = 0, ofp3 = 0, fp3 = __flp;
336 ofp3 = fp3, fp3 = fp3->
nx) {
337 if (fp3 == fp2 && fp3->sz +
sizeof(
size_t) >= incr) {
339 if (fp3->sz +
sizeof(
size_t) - incr >
sizeof(
struct __freelist)) {
341 cp = (
char *)ptr + len;
344 fp2->
sz = fp3->sz - incr;
348 fp1->
sz += fp3->sz +
sizeof(size_t);
371 if (__brkval == (
char *)ptr + fp1->
sz && len > s) {
372 cp = (
char *)ptr + len;
373 cp1 = STACK_POINTER() - __MALLOC_MARGIN__;
376 __brkval_maximum = cp;
388 if ((memp = malloc(len)) == 0)
390 memcpy(memp, ptr, fp1->
sz);
Freelist overlay for the tiny malloc implementation.
size_t sz
number of bytes free here.
struct __freelist * nx
link pointer