Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
a9928e0e376786b97089826a791838c5f08d77d8
[simgrid.git] / src / xbt / mmalloc / mm_legacy.c
1 /* Copyright (c) 2010. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 /* Redefine the classical malloc/free/realloc functions so that they fit well in the mmalloc framework */
8
9 #include "mmprivate.h"
10
11 static void *__mmalloc_current_heap = NULL;     /* The heap we are currently using. */
12
13 #include "xbt_modinter.h"
14
15 void *mmalloc_get_current_heap(void)
16 {
17   return __mmalloc_current_heap;
18 }
19
20 void mmalloc_set_current_heap(void *new_heap)
21 {
22   __mmalloc_current_heap = new_heap;
23 }
24
25 #ifdef MMALLOC_WANT_OVERIDE_LEGACY
26 void *malloc(size_t n)
27 {
28 #ifdef HAVE_MMAP
29   if (!__mmalloc_current_heap)
30     mmalloc_preinit();
31 #endif
32   void *ret = mmalloc(__mmalloc_current_heap, n);
33
34   return ret;
35 }
36
37 void *calloc(size_t nmemb, size_t size)
38 {
39   size_t total_size = nmemb * size;
40 #ifdef HAVE_MMAP
41   if (!__mmalloc_current_heap)
42     mmalloc_preinit();
43 #endif
44   void *ret = mmalloc(__mmalloc_current_heap, total_size);
45
46   /* Fill the allocated memory with zeroes to mimic calloc behaviour */
47   memset(ret, '\0', total_size);
48
49   return ret;
50 }
51
52 void *realloc(void *p, size_t s)
53 {
54   void *ret = NULL;
55 #ifdef HAVE_MMAP
56   if (!__mmalloc_current_heap)
57     mmalloc_preinit();
58 #endif
59   if (s) {
60     if (p)
61       ret = mrealloc(__mmalloc_current_heap, p, s);
62     else
63       ret = mmalloc(__mmalloc_current_heap, s);
64   } else {
65     if (p)
66       mfree(__mmalloc_current_heap, p);
67   }
68
69   return ret;
70 }
71
72 void free(void *p)
73 {
74   return mfree(__mmalloc_current_heap, p);
75 }
76 #endif
77
78 /* Make sure it works with md==NULL */
79
80 #define HEAP_OFFSET   40960000  /* Safety gap from the heap's break address */
81
82 void *mmalloc_get_default_md(void)
83 {
84   xbt_assert(__mmalloc_default_mdp);
85   return __mmalloc_default_mdp;
86 }
87
88 /* Initialize the default malloc descriptor. */
89 void mmalloc_preinit(void)
90 {
91   if (!__mmalloc_default_mdp)
92     __mmalloc_default_mdp =
93         mmalloc_attach(-1, (char *) sbrk(0) + HEAP_OFFSET);
94   xbt_assert(__mmalloc_default_mdp != NULL);
95 }
96
97 void mmalloc_postexit(void)
98 {
99   /* Do not detach the default mdp or ldl won't be able to free the memory it allocated since we're in memory */
100   //  mmalloc_detach(__mmalloc_default_mdp);
101 }