-/* Copyright (c) 2010-2015. The SimGrid Team.
+/* Copyright (c) 2010-2022. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include <dlfcn.h>
-#include "src/mc/mc_base.h"
#include "mmprivate.h"
-#include "src/xbt_modinter.h"
#include "src/internal_config.h"
+#include "src/mc/remote/mc_protocol.h"
+#include "xbt/xbt_modinter.h"
#include <math.h>
-#include "src/mc/mc_protocol.h"
-/* ***** Whether to use `mmalloc` of the undrlying malloc ***** */
+/* ***** Whether to use `mmalloc` of the underlying malloc ***** */
static int __malloc_use_mmalloc;
return __mmalloc_current_heap;
}
-xbt_mheap_t mmalloc_set_current_heap(xbt_mheap_t new_heap)
-{
- xbt_mheap_t heap = __mmalloc_current_heap;
- __mmalloc_current_heap = new_heap;
- return heap;
-}
-
/* Override the malloc-like functions if MC is activated at compile time */
-#ifdef HAVE_MC
+#if SIMGRID_HAVE_MC
/* ***** Temporary allocator
*
* This is used before we have found the real malloc implementation with dlsym.
*/
-#define BUFFER_SIZE 32
+#ifdef __FreeBSD__ /* FreeBSD require more memory, other might */
+# define BUFFER_SIZE 256
+#else /* Valid on: Linux */
+# define BUFFER_SIZE 32
+#endif
static size_t fake_alloc_index;
static uint64_t buffer[BUFFER_SIZE];
size_t count = n / sizeof(uint64_t);
if (n % sizeof(uint64_t))
count++;
- // Check that we have enough availabel memory:
+ // Check that we have enough available memory:
if (fake_alloc_index + count >= BUFFER_SIZE)
exit(127);
// Allocate it:
return mm_fake_malloc(n);
}
-static void* mm_fake_realloc(void *p, size_t s)
+static void* mm_fake_realloc(XBT_ATTRIB_UNUSED void* p, size_t s)
{
return mm_fake_malloc(s);
}
-static void mm_fake_free(void *p)
+static void mm_fake_free(XBT_ATTRIB_UNUSED void* p)
{
+ // Nothing to do
}
/* Function signatures for the main malloc functions: */
/** Constructor functions used to initialize the malloc implementation
*/
-static void __attribute__((constructor(101))) mm_legacy_constructor()
+XBT_ATTRIB_CONSTRUCTOR(101) static void mm_legacy_constructor()
{
if (mm_initialized)
return;
mm_initializing = 1;
- __malloc_use_mmalloc = getenv(MC_ENV_VARIABLE) ? 1 : 0;
+ __malloc_use_mmalloc = getenv(MC_ENV_SOCKET_FD) ? 1 : 0;
if (__malloc_use_mmalloc) {
__mmalloc_current_heap = mmalloc_preinit();
} else {
+#if HAVE_DLFUNC
+ mm_real_realloc = (void *(*)(void *, size_t))dlfunc(RTLD_NEXT, "realloc");
+ mm_real_malloc = (void *(*)(size_t))dlfunc(RTLD_NEXT, "malloc");
+ mm_real_free = (void (*)(void *))dlfunc(RTLD_NEXT, "free");
+ mm_real_calloc = (void *(*)(size_t, size_t))dlfunc(RTLD_NEXT, "calloc");
+#else
mm_real_realloc = dlsym(RTLD_NEXT, "realloc");
mm_real_malloc = dlsym(RTLD_NEXT, "malloc");
mm_real_free = dlsym(RTLD_NEXT, "free");
mm_real_calloc = dlsym(RTLD_NEXT, "calloc");
+#endif
}
mm_initializing = 0;
mm_initialized = 1;
#define GET_HEAP() __mmalloc_current_heap
-void* malloc_no_memset(size_t n)
-{
- if (!mm_initialized) {
- if (mm_initializing)
- return mm_fake_malloc(n);
- mm_legacy_constructor();
- }
-
- if (!__malloc_use_mmalloc) {
- return mm_real_malloc(n);
- }
-
- xbt_mheap_t mdp = GET_HEAP();
- if (!mdp)
- return NULL;
-
- LOCK(mdp);
- void *ret = mmalloc_no_memset(mdp, n);
- UNLOCK(mdp);
- return ret;
-}
-
void *malloc(size_t n)
{
if (!mm_initialized) {
mfree(mdp, p);
UNLOCK(mdp);
}
-#endif /* HAVE_MC */
+#endif /* SIMGRID_HAVE_MC */