File: mem.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 (100 lines) | stat: -rw-r--r-- 1,894 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
100
#include "mem.h"

static size_t memused = 0;

#ifdef DEBUG_MEM

static dnode_t *dhead;
static unsigned int dsize;

void YMEMLEAKCHECK(void)
{
    dnode_t *v;
    unsigned int tleak;

    v = dhead;
    tleak = 0;
    while(v) {
        fprintf(stderr, "[YMEM]    Leaked block: (addr:%p) (size:%d)\n", v->ptr, v->size);
        tleak += v->size;
        v = v->next;
    }
    if (tleak == 0)
        fprintf(stderr, "[YMEM]    Application currently has no leakage.[%d]\n", dsize);
    else
        fprintf(stderr, "[YMEM]    Application currently leaking %d bytes.[%d]\n", tleak, dsize);
}
#else
void YMEMLEAKCHECK(void)
{
    ;
}
#endif


size_t
ymemusage(void)
{
    return memused;
}

void *
ymalloc(size_t size)
{
    void *p;
#ifdef DEBUG_MEM
    dnode_t *v;
#endif

    p = PyMem_Malloc(size+sizeof(size_t));
    if (!p) {
        yerr("malloc(%u) failed. No memory?", (unsigned int)size);
        return NULL;
    }
    memused += size;
    *(size_t *)p = size;
#ifdef DEBUG_MEM
    if (dhead)
        yinfo("_ymalloc(%u) called[%p].[old_head:%p]", (unsigned int)size, p, dhead->ptr);
    else
        yinfo("_ymalloc(%u) called[%p].[old_head:nil]", (unsigned int)size, p);
    v = PyMem_Malloc(sizeof(dnode_t));
    v->ptr = p;
    v->size = size;
    v->next = dhead;
    dhead = v;
    dsize++;
#endif
    return (char *)p+sizeof(size_t);
}

void
yfree(void *p)
{
#ifdef DEBUG_MEM
    dnode_t *v;
    dnode_t *prev;
#endif
    p = (char *)p - sizeof(size_t);
    memused -= *(size_t *)p;
#ifdef DEBUG_MEM
    v = dhead;
    prev = NULL;
    while(v) {
        if (v->ptr == p) {
            if (prev)
                prev->next = v->next;
            else
                dhead = v->next;

            yinfo("_yfree(%p) called.", p);
            PyMem_Free(v);
            dsize--;
            break;
        }
        prev = v;
        v = v->next;
    }
#endif
    PyMem_Free(p);
}