OpenCores
URL https://opencores.org/ocsvn/eco32/eco32/trunk

Subversion Repositories eco32

[/] [eco32/] [tags/] [eco32-0.23/] [lcc/] [src/] [alloc.c] - Diff between revs 4 and 157

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 4 Rev 157
#include "c.h"
#include "c.h"
struct block {
struct block {
        struct block *next;
        struct block *next;
        char *limit;
        char *limit;
        char *avail;
        char *avail;
};
};
union align {
union align {
        long l;
        long l;
        char *p;
        char *p;
        double d;
        double d;
        int (*f)(void);
        int (*f)(void);
};
};
union header {
union header {
        struct block b;
        struct block b;
        union align a;
        union align a;
};
};
#ifdef PURIFY
#ifdef PURIFY
union header *arena[3];
union header *arena[3];
 
 
void *allocate(unsigned long n, unsigned a) {
void *allocate(unsigned long n, unsigned a) {
        union header *new = malloc(sizeof *new + n);
        union header *new = malloc(sizeof *new + n);
 
 
        assert(a < NELEMS(arena));
        assert(a < NELEMS(arena));
        if (new == NULL) {
        if (new == NULL) {
                error("insufficient memory\n");
                error("insufficient memory\n");
                exit(1);
                exit(1);
        }
        }
        new->b.next = (void *)arena[a];
        new->b.next = (void *)arena[a];
        arena[a] = new;
        arena[a] = new;
        return new + 1;
        return new + 1;
}
}
 
 
void deallocate(unsigned a) {
void deallocate(unsigned a) {
        union header *p, *q;
        union header *p, *q;
 
 
        assert(a < NELEMS(arena));
        assert(a < NELEMS(arena));
        for (p = arena[a]; p; p = q) {
        for (p = arena[a]; p; p = q) {
                q = (void *)p->b.next;
                q = (void *)p->b.next;
                free(p);
                free(p);
        }
        }
        arena[a] = NULL;
        arena[a] = NULL;
}
}
 
 
void *newarray(unsigned long m, unsigned long n, unsigned a) {
void *newarray(unsigned long m, unsigned long n, unsigned a) {
        return allocate(m*n, a);
        return allocate(m*n, a);
}
}
#else
#else
static struct block
static struct block
         first[] = {  { NULL },  { NULL },  { NULL } },
         first[] = {  { NULL },  { NULL },  { NULL } },
        *arena[] = { &first[0], &first[1], &first[2] };
        *arena[] = { &first[0], &first[1], &first[2] };
static struct block *freeblocks;
static struct block *freeblocks;
 
 
void *allocate(unsigned long n, unsigned a) {
void *allocate(unsigned long n, unsigned a) {
        struct block *ap;
        struct block *ap;
 
 
        assert(a < NELEMS(arena));
        assert(a < NELEMS(arena));
        assert(n > 0);
        assert(n > 0);
        ap = arena[a];
        ap = arena[a];
        n = roundup(n, sizeof (union align));
        n = roundup(n, sizeof (union align));
        while (n > ap->limit - ap->avail) {
        while (n > ap->limit - ap->avail) {
                if ((ap->next = freeblocks) != NULL) {
                if ((ap->next = freeblocks) != NULL) {
                        freeblocks = freeblocks->next;
                        freeblocks = freeblocks->next;
                        ap = ap->next;
                        ap = ap->next;
                } else
                } else
                        {
                        {
                                unsigned m = sizeof (union header) + n + roundup(10*1024, sizeof (union align));
                                unsigned m = sizeof (union header) + n + roundup(10*1024, sizeof (union align));
                                ap->next = malloc(m);
                                ap->next = malloc(m);
                                ap = ap->next;
                                ap = ap->next;
                                if (ap == NULL) {
                                if (ap == NULL) {
                                        error("insufficient memory\n");
                                        error("insufficient memory\n");
                                        exit(1);
                                        exit(1);
                                }
                                }
                                ap->limit = (char *)ap + m;
                                ap->limit = (char *)ap + m;
                        }
                        }
                ap->avail = (char *)((union header *)ap + 1);
                ap->avail = (char *)((union header *)ap + 1);
                ap->next = NULL;
                ap->next = NULL;
                arena[a] = ap;
                arena[a] = ap;
 
 
        }
        }
        ap->avail += n;
        ap->avail += n;
        return ap->avail - n;
        return ap->avail - n;
}
}
 
 
void *newarray(unsigned long m, unsigned long n, unsigned a) {
void *newarray(unsigned long m, unsigned long n, unsigned a) {
        return allocate(m*n, a);
        return allocate(m*n, a);
}
}
void deallocate(unsigned a) {
void deallocate(unsigned a) {
        assert(a < NELEMS(arena));
        assert(a < NELEMS(arena));
        arena[a]->next = freeblocks;
        arena[a]->next = freeblocks;
        freeblocks = first[a].next;
        freeblocks = first[a].next;
        first[a].next = NULL;
        first[a].next = NULL;
        arena[a] = &first[a];
        arena[a] = &first[a];
}
}
#endif
#endif
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.