]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/valgrind/src/valgrind-3.6.0-svn/massif/tests/custom_alloc.c
Inital import
[l4.git] / l4 / pkg / valgrind / src / valgrind-3.6.0-svn / massif / tests / custom_alloc.c
1 #include <unistd.h>
2 #include "tests/sys_mman.h"
3 #include <assert.h>
4 #include <stdlib.h>
5
6 #include "valgrind.h"
7
8 #define SUPERBLOCK_SIZE    100000
9
10 //-------------------------------------------------------------------------
11 // Allocator
12 //-------------------------------------------------------------------------
13
14 void* get_superblock(void)
15 {
16    void* p = mmap( 0, SUPERBLOCK_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC,
17                    MAP_PRIVATE|MAP_ANONYMOUS, -1, 0 );
18
19    assert(p != ((void*)(-1)));
20
21    return p;
22 }
23
24 // has a redzone
25 static void* custom_alloc(int size)
26 {
27 #define RZ  8
28    static void* hp     = 0;    // current heap pointer
29    static void* hp_lim = 0;    // maximum usable byte in current block
30    int          size2  = size + RZ*2;
31    void*        p;
32
33    if (hp + size2 > hp_lim) {
34       hp = get_superblock();
35       hp_lim = hp + SUPERBLOCK_SIZE - 1;
36    }  
37
38    p = hp + RZ;
39    hp += size2;
40
41    VALGRIND_MALLOCLIKE_BLOCK( p, size, RZ, /*is_zeroed*/1 );
42    return (void*)p;
43 }     
44
45 static void custom_free(void* p)
46 {
47    // don't actually free any memory... but mark it as freed
48    VALGRIND_FREELIKE_BLOCK( p, RZ );
49 }
50 #undef RZ
51
52
53
54 //-------------------------------------------------------------------------
55 // Rest
56 //-------------------------------------------------------------------------
57
58 int main(void)
59 {
60    int* a = custom_alloc(400);   // All sizes are divisible by 16 -- no slop.
61    custom_free(a);
62
63    a = custom_alloc(800);
64    custom_free(a);
65
66    a = malloc(400);
67    free(a);
68
69    a = malloc(800);
70    free(a);
71
72    return 0;
73 }