Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Forgotten by commit 8c9500c.
[simgrid.git] / teshsuite / xbt / mmalloc_test.c
1 #include "xbt/mmalloc.h"
2 #include "xbt.h"
3 #include <stdio.h>
4 #include <assert.h>
5 #include <fcntl.h>
6 #include <sys/stat.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <unistd.h>
10
11 XBT_LOG_NEW_DEFAULT_CATEGORY(test,"this test");
12
13 #define BUFFSIZE 204800
14 #define TESTSIZE 100
15 #define size_of_block(i) (((i % 50)+1)* 100)
16
17 int main(int argc, char**argv)
18 {
19   void *heapA;
20   void *pointers[TESTSIZE];
21   xbt_init(&argc,argv);
22
23   XBT_INFO("Allocating a new heap");
24   heapA = xbt_mheap_new(-1, ((char*)sbrk(0)) + BUFFSIZE);
25   if (heapA == NULL) {
26     perror("attach 1 failed");
27     fprintf(stderr, "bye\n");
28     exit(1);
29   }
30
31   XBT_INFO("HeapA allocated");
32
33   int i, size;
34   for (i = 0; i < TESTSIZE; i++) {
35     size = size_of_block(i);
36     pointers[i] = mmalloc(heapA, size);
37     XBT_INFO("%d bytes allocated with offset %tx", size, ((char*)pointers[i])-((char*)heapA));
38   }
39   XBT_INFO("All blocks were correctly allocated. Free every second block");
40   for (i = 0; i < TESTSIZE; i+=2) {
41     mfree(heapA,pointers[i]);
42   }
43   XBT_INFO("Memset every second block to zero (yeah, they are not currently allocated :)");
44   for (i = 0; i < TESTSIZE; i+=2) {
45     size = size_of_block(i);
46     memset(pointers[i],0, size);
47   }
48   XBT_INFO("Re-allocate every second block");
49   for (i = 0; i < TESTSIZE; i+=2) {
50     size = size_of_block(i);
51     pointers[i] = mmalloc(heapA, size);
52   }
53
54   XBT_INFO("free all blocks (each one twice, to check that double free are correctly catched)");
55   for (i = 0; i < TESTSIZE; i++) {
56     xbt_ex_t e;
57     int gotit = 1;
58
59     mfree(heapA, pointers[i]);
60     TRY {
61       mfree(heapA, pointers[i]);
62       gotit = 0;
63     } CATCH(e) {
64       xbt_ex_free(e);
65     }
66     if (!gotit)
67       xbt_die("FAIL: A double-free went undetected (for size:%d)",size_of_block(i));
68   }
69
70   XBT_INFO("free again all blocks (to really check that double free are correctly catched)");
71   for (i = 0; i < TESTSIZE; i++) {
72     xbt_ex_t e;
73     int gotit = 1;
74
75     TRY {
76       mfree(heapA, pointers[i]);
77       gotit = 0;
78     } CATCH(e) {
79       xbt_ex_free(e);
80     }
81     if (!gotit)
82       xbt_die("FAIL: A double-free went undetected (for size:%d)",size_of_block(i));
83   }
84
85
86   XBT_INFO("Damnit, I cannot break mmalloc this time. That's SO disappointing.");
87   return 0;
88 }