1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
#include "freelist.h"
#include "mem.h"
static int
_flgrow(_freelist *flp)
{
int i, newsize;
void **old;
old = flp->items;
newsize = flp->size * 2;
flp->items = ymalloc(newsize * sizeof(void *));
if (!flp->items)
return 0;
// init new list
for(i=0; i<flp->size; i++) {
flp->items[i] = ymalloc(flp->chunksize);
if (!flp->items[i]) {
yfree(flp->items);
return 0;
}
}
// copy old list
for(i=flp->size; i<newsize; i++)
flp->items[i] = old[i-flp->size];
yfree(old);
flp->head = flp->size-1;
flp->size = newsize;
return 1;
}
_freelist *
flcreate(int chunksize, int size)
{
int i;
_freelist *flp;
flp = (_freelist *)ymalloc(sizeof(_freelist));
if (!flp)
return NULL;
flp->items = ymalloc(size * sizeof(void *));
if (!flp->items) {
yfree(flp);
return NULL;
}
for (i=0; i<size; i++) {
flp->items[i] = ymalloc(chunksize);
if (!flp->items[i]) {
yfree(flp->items);
yfree(flp);
return NULL;
}
}
flp->size = size;
flp->chunksize = chunksize;
flp->head = size-1;
return flp;
}
void
fldestroy(_freelist *flp)
{
int i;
for (i=0; i<flp->size; i++) {
yfree(flp->items[i]);
}
yfree(flp->items);
yfree(flp);
}
void *
flget(_freelist *flp)
{
if (flp->head < 0) {
if (!_flgrow(flp))
return NULL;
}
return flp->items[flp->head--];
}
int
flput(_freelist *flp, void *p)
{
if (flp->head > flp->size-2)
return 0;
flp->items[++flp->head] = p;
return 1;
}
unsigned int
flcount(_freelist *flp)
{
return flp->size - flp->head + 1;
}
|