Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Align address on a page boundary.
[simgrid.git] / src / xbt / mmalloc / mm_legacy.c
index d6df507..2bced98 100644 (file)
@@ -7,6 +7,7 @@
 /* Redefine the classical malloc/free/realloc functions so that they fit well in the mmalloc framework */
 
 #include "mmprivate.h"
+#include "gras_config.h"
 
 static void *__mmalloc_current_heap = NULL;     /* The heap we are currently using. */
 
@@ -81,6 +82,9 @@ void *realloc(void *p, size_t s)
 void free(void *p)
 {
   void *mdp = __mmalloc_current_heap;
+#ifdef HAVE_GTNETS
+  if(!mdp) return;
+#endif
   LOCK(mdp);
   mfree(mdp, p);
   UNLOCK(mdp);
@@ -89,9 +93,10 @@ void free(void *p)
 
 /* Make sure it works with md==NULL */
 
-#define HEAP_OFFSET   (128<<20)  /* Safety gap from the heap's break address.
-                                  * Try to increase this first if you experience
-                                  * strange errors under valgrind. */
+/* Safety gap from the heap's break address.
+ * Try to increase this first if you experience strange errors under
+ * valgrind. */
+#define HEAP_OFFSET   (128UL<<20)
 
 void *mmalloc_get_default_md(void)
 {
@@ -139,13 +144,16 @@ static void mmalloc_fork_child(void)
 /* Initialize the default malloc descriptor. */
 void mmalloc_preinit(void)
 {
+  int res;
   if (!__mmalloc_default_mdp) {
-    __mmalloc_default_mdp =
-        mmalloc_attach(-1, (char *) sbrk(0) + HEAP_OFFSET);
+    unsigned long mask = ~((unsigned long)getpagesize() - 1);
+    void *addr = (void*)(((unsigned long)sbrk(0) + HEAP_OFFSET) & mask);
+    __mmalloc_default_mdp = mmalloc_attach(-1, addr);
     /* Fixme? only the default mdp in protected against forks */
-    if (xbt_os_thread_atfork(mmalloc_fork_prepare,
-                             mmalloc_fork_parent, mmalloc_fork_child) != 0)
-      abort();
+    res = xbt_os_thread_atfork(mmalloc_fork_prepare,
+                              mmalloc_fork_parent, mmalloc_fork_child);
+    if (res != 0)
+      THROWF(system_error,0,"xbt_os_thread_atfork() failed: return value %d",res);
   }
   xbt_assert(__mmalloc_default_mdp != NULL);
 }