-/* Copyright (c) 2010-2020. The SimGrid Team.
- * All rights reserved. */
+/* Copyright (c) 2010-2023. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
/* Redefine the classical malloc/free/realloc functions so that they fit well in the mmalloc framework */
#define _GNU_SOURCE
-#include <stdlib.h>
-
-#include <dlfcn.h>
-
#include "mmprivate.h"
-#include "src/internal_config.h"
-#include "src/mc/mc_base.h"
-#include "src/mc/remote/mc_protocol.h"
-#include "src/xbt_modinter.h"
+#include "src/mc/mc_environ.h" // MC_ENV_SOCKET_FD
+#include <dlfcn.h>
#include <math.h>
+#include <stdlib.h>
/* ***** Whether to use `mmalloc` of the underlying malloc ***** */
}
/* Override the malloc-like functions if MC is activated at compile time */
-#if SIMGRID_HAVE_MC
-
/* ***** Temporary allocator
*
* This is used before we have found the real malloc implementation with dlsym.
*/
-#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];
+static uint64_t buffer[mmalloc_preinit_buffer_size];
+uint64_t* mmalloc_preinit_buffer = buffer;
/* Fake implementations, they are used to fool dlsym:
* dlsym used calloc and falls back to some other mechanism
*/
static void* mm_fake_malloc(size_t n)
{
+ mmalloc_preinit_buffer = buffer;
+
// How many uint64_t do w need?
size_t count = n / sizeof(uint64_t);
if (n % sizeof(uint64_t))
count++;
// Check that we have enough available memory:
- if (fake_alloc_index + count >= BUFFER_SIZE)
+ if (fake_alloc_index + count >= mmalloc_preinit_buffer_size) {
+ puts("mmalloc is not initialized yet, but the static buffer used as malloc replacement is already exhausted. "
+ "Please increase `mmalloc_preinit_buffer_size` in mm_legacy.c\n");
exit(127);
+ }
// Allocate it:
uint64_t* res = buffer + fake_alloc_index;
fake_alloc_index += count;
if (mm_initialized)
return;
mm_initializing = 1;
- __malloc_use_mmalloc = getenv(MC_ENV_VARIABLE) ? 1 : 0;
+ __malloc_use_mmalloc = getenv(MC_ENV_SOCKET_FD) != NULL;
if (__malloc_use_mmalloc) {
__mmalloc_current_heap = mmalloc_preinit();
} else {
mm_real_calloc = dlsym(RTLD_NEXT, "calloc");
#endif
}
+
mm_initializing = 0;
mm_initialized = 1;
}
if (!mdp)
return NULL;
- LOCK(mdp);
- void *ret = mmalloc(mdp, n);
- UNLOCK(mdp);
- return ret;
+ return mmalloc(mdp, n);
}
void *calloc(size_t nmemb, size_t size)
if (!mdp)
return NULL;
- LOCK(mdp);
void *ret = mmalloc(mdp, nmemb*size);
- UNLOCK(mdp);
// This was already done in the callee:
if(!(mdp->options & XBT_MHEAP_OPTION_MEMSET)) {
memset(ret, 0, nmemb * size);
if (!mdp)
return NULL;
- LOCK(mdp);
- void* ret = mrealloc(mdp, p, s);
- UNLOCK(mdp);
- return ret;
+ return mrealloc(mdp, p, s);
}
void free(void *p)
return;
xbt_mheap_t mdp = GET_HEAP();
- LOCK(mdp);
mfree(mdp, p);
- UNLOCK(mdp);
}
-#endif /* SIMGRID_HAVE_MC */