Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge remote-tracking branch 'origin/master'
[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 %tu", 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     size = size_of_block(i);
42     mfree(heapA,pointers[i]);
43   }
44   XBT_INFO("Re-allocate every second block");
45   for (i = 0; i < TESTSIZE; i+=2) {
46     size = size_of_block(i);
47     pointers[i] = mmalloc(heapA, size);
48   }
49
50   XBT_INFO("free all blocks (each one twice, to check that double free are correctly catched)");
51   for (i = 0; i < TESTSIZE; i++) {
52     xbt_ex_t e;
53     int gotit = 1;
54
55     mfree(heapA, pointers[i]);
56     TRY {
57       mfree(heapA, pointers[i]);
58       gotit = 0;
59     } CATCH(e) {
60       xbt_ex_free(e);
61     }
62     if (!gotit)
63       xbt_die("FAIL: A double-free went undetected (for size:%d)",size_of_block(i));
64   }
65
66   XBT_INFO("free again all blocks (to really check that double free are correctly catched)");
67   for (i = 0; i < TESTSIZE; i++) {
68     xbt_ex_t e;
69     int gotit = 1;
70
71     TRY {
72       mfree(heapA, pointers[i]);
73       gotit = 0;
74     } CATCH(e) {
75       xbt_ex_free(e);
76     }
77     if (!gotit)
78       xbt_die("FAIL: A double-free went undetected (for size:%d)",size_of_block(i));
79   }
80
81
82   XBT_INFO("Damnit, I cannot break mmalloc this time. That's SO disappointing.");
83   return 0;
84 }