-/* Initialization for acces s to a mmap'd malloc managed region. */
+/* Initialization for access to a mmap'd malloc managed region. */
-/* Copyright (c) 2012-2014. The SimGrid Team.
+/* Copyright (c) 2012-2019. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
starting at the specified address BASEADDR in the process address
space.
- The provided BASEADDR should be choosed carefully in order to avoid
+ The provided BASEADDR should be chosen carefully in order to avoid
bumping into existing mapped regions or future mapped regions.
On success, returns a "malloc descriptor" which is used in subsequent
* Try to increase this first if you experience strange errors under valgrind. */
#define HEAP_OFFSET (128UL<<20)
-xbt_mheap_t mmalloc_get_default_md(void)
-{
- xbt_assert(__mmalloc_default_mdp);
- return __mmalloc_default_mdp;
-}
-
static void mmalloc_fork_prepare(void)
{
xbt_mheap_t mdp = NULL;
unsigned long mask = ~((unsigned long)xbt_pagesize - 1);
void *addr = (void*)(((unsigned long)sbrk(0) + HEAP_OFFSET) & mask);
__mmalloc_default_mdp = xbt_mheap_new_options(-1, addr, XBT_MHEAP_OPTION_MEMSET);
- /* Fixme? only the default mdp in protected against forks */
- // This is mandated to protect the mmalloced areas through forks. Think of tesh.
- // Nah, removing the mutex isn't a good idea either for tesh
- int 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);
+
+ // atfork mandated at least on FreeBSD, or simgrid-mc will fail to fork the verified app
+ int res = pthread_atfork(mmalloc_fork_prepare, mmalloc_fork_parent, mmalloc_fork_child);
+ xbt_assert(res == 0, "pthread_atfork() failed: return value %d", res);
}
xbt_assert(__mmalloc_default_mdp != NULL);
{
/* Do not destroy the default mdp or ldl won't be able to free the memory it
* allocated since we're in memory */
- // xbt_mheap_destroy_no_free(__mmalloc_default_mdp);
+ // xbt_mheap_destroy_no_free(__mmalloc_default_mdp)
}
// This is the underlying implementation of mmalloc_get_bytes_used_remote.
}
return bytes;
}
-
-size_t mmalloc_get_bytes_used(const xbt_mheap_t heap){
- const struct mdesc* heap_data = (const struct mdesc *) heap;
- return mmalloc_get_bytes_used_remote(heap_data->heaplimit, heap_data->heapinfo);
-}
-
-ssize_t mmalloc_get_busy_size(xbt_mheap_t heap, void *ptr){
-
- ssize_t block = ((char*)ptr - (char*)(heap->heapbase)) / BLOCKSIZE + 1;
- if(heap->heapinfo[block].type < 0)
- return -1;
- else if(heap->heapinfo[block].type == MMALLOC_TYPE_UNFRAGMENTED)
- return heap->heapinfo[block].busy_block.busy_size;
- else{
- ssize_t frag = ((uintptr_t) (ADDR2UINT (ptr) % (BLOCKSIZE))) >> heap->heapinfo[block].type;
- return heap->heapinfo[block].busy_frag.frag_size[frag];
- }
-
-}
-
-void mmcheck(xbt_mheap_t heap) {return;
- if (!heap->heapinfo)
- return;
- malloc_info* heapinfo = NULL;
- for (size_t i=1; i < heap->heaplimit; i += mmalloc_get_increment(heapinfo)) {
- heapinfo = heap->heapinfo + i;
- switch (heapinfo->type) {
- case MMALLOC_TYPE_HEAPINFO:
- case MMALLOC_TYPE_FREE:
- if (heapinfo->free_block.size==0) {
- xbt_die("Block size == 0");
- }
- break;
- case MMALLOC_TYPE_UNFRAGMENTED:
- if (heapinfo->busy_block.size==0) {
- xbt_die("Block size == 0");
- }
- if (heapinfo->busy_block.busy_size==0 && heapinfo->busy_block.size!=0) {
- xbt_die("Empty busy block");
- }
- break;
- default:
- if (heapinfo->type<0) {
- xbt_die("Unkown mmalloc block type.");
- }
- }
- }
-}