File: freelist.c

package info (click to toggle)
python-yappi 1.6.10-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 1,612 kB
  • sloc: python: 4,081; ansic: 2,500; makefile: 27
file content (99 lines) | stat: -rw-r--r-- 1,757 bytes parent folder | download | duplicates (2)
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;
}