custom_alloc.c revision ed07e00d438c74b7a23c01bfffde77e3968305e4
1202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <unistd.h>
24d35af868a667e7792cf54a62ded8df85ece8d03Naseer Ahmed#include "tests/sys_mman.h"
3202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <assert.h>
4ca3f7173ece307bcb647e0058d9fab5573558364Mathew Karimpanal#include <stdlib.h>
54d35af868a667e7792cf54a62ded8df85ece8d03Naseer Ahmed
64d35af868a667e7792cf54a62ded8df85ece8d03Naseer Ahmed#include "valgrind.h"
74d35af868a667e7792cf54a62ded8df85ece8d03Naseer Ahmed
84d35af868a667e7792cf54a62ded8df85ece8d03Naseer Ahmed#define SUPERBLOCK_SIZE    100000
94d35af868a667e7792cf54a62ded8df85ece8d03Naseer Ahmed
1056f610dd235b577725198e9341caae92379fdf23Saurabh Shah//-------------------------------------------------------------------------
11d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shah// Allocator
12ca3f7173ece307bcb647e0058d9fab5573558364Mathew Karimpanal//-------------------------------------------------------------------------
134d35af868a667e7792cf54a62ded8df85ece8d03Naseer Ahmed
144c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmedvoid* get_superblock(void)
154c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed{
164c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed   void* p = mmap( 0, SUPERBLOCK_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC,
174c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed                   MAP_PRIVATE|MAP_ANONYMOUS, -1, 0 );
18ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed
19d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed   assert(p != ((void*)(-1)));
206c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R
21d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shah   return p;
22d5e3e404e1344eb2148c8df9f3e35d841ddd4285Saurabh Shah}
234c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed
24202a77d28ac251545f6f998a974690212309b927Iliyan Malchev// has a redzone
25static 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
45static 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
58int 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}
74