X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/13fb4af932a02ea0bd4293d1e55ac071de326f80..202b3c34671d1e0825b32532564366d3129d1422:/src/xbt/mmalloc/mm_module.c diff --git a/src/xbt/mmalloc/mm_module.c b/src/xbt/mmalloc/mm_module.c index eac80c81e8..9f960956a6 100644 --- a/src/xbt/mmalloc/mm_module.c +++ b/src/xbt/mmalloc/mm_module.c @@ -1,6 +1,6 @@ /* Initialization for acces s 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 @@ -120,7 +120,8 @@ xbt_mheap_t xbt_mheap_new_options(int fd, void *baseaddr, int options) unsuccessful for some reason. */ struct mdesc newmd; - struct mdesc *mdptr = NULL, *mdptemp = NULL; + struct mdesc* mdptr = NULL; + struct mdesc* mdptemp = NULL; if (lseek(fd, 0L, SEEK_SET) != 0) return NULL; @@ -156,15 +157,13 @@ xbt_mheap_t xbt_mheap_new_options(int fd, void *baseaddr, int options) } } - /* NULL is not a valid baseaddr as we cannot map anything there. - C'mon, user. Think! */ + /* NULL is not a valid baseaddr as we cannot map anything there. C'mon, user. Think! */ if (baseaddr == NULL) return (NULL); - /* We start off with the malloc descriptor allocated on the stack, until - we build it up enough to call _mmalloc_mmap_morecore() to allocate the - first page of the region and copy it there. Ensure that it is zero'd and - then initialize the fields that we know values for. */ + /* We start off with the malloc descriptor allocated on the stack, until we build it up enough to + * call _mmalloc_mmap_morecore() to allocate the first page of the region and copy it there. Ensure that it is + * zero'd and then initialize the fields that we know values for. */ mdp = &mtemp; memset((char *) mdp, 0, sizeof(mtemp)); @@ -187,10 +186,9 @@ xbt_mheap_t xbt_mheap_new_options(int fd, void *baseaddr, int options) /* If we have not been passed a valid open file descriptor for the file to map to, then open /dev/zero and use that to map to. */ - /* Now try to map in the first page, copy the malloc descriptor structure - there, and arrange to return a pointer to this new copy. If the mapping - fails, then close the file descriptor if it was opened by us, and arrange - to return a NULL. */ + /* Now try to map in the first page, copy the malloc descriptor structure there, and arrange to return a pointer to + * this new copy. If the mapping fails, then close the file descriptor if it was opened by us, and arrange to return + * a NULL. */ if ((mbase = mmorecore(mdp, sizeof(mtemp))) != NULL) { memcpy(mbase, mdp, sizeof(mtemp)); @@ -229,41 +227,35 @@ void xbt_mheap_destroy_no_free(xbt_mheap_t md) } } -/** Terminate access to a mmalloc managed region by unmapping all memory pages - associated with the region, and closing the file descriptor if it is one - that we opened. +/** Terminate access to a mmalloc managed region by unmapping all memory pages associated with the region, and closing + * the file descriptor if it is one that we opened. Returns NULL on success. - Returns the malloc descriptor on failure, which can subsequently be used - for further action, such as obtaining more information about the nature of - the failure. + Returns the malloc descriptor on failure, which can subsequently be used for further action, such as obtaining more + information about the nature of the failure. - Note that the malloc descriptor that we are using is currently located in - region we are about to unmap, so we first make a local copy of it on the - stack and use the copy. */ + Note that the malloc descriptor that we are using is currently located in region we are about to unmap, so we first + make a local copy of it on the stack and use the copy. */ void *xbt_mheap_destroy(xbt_mheap_t mdp) { - struct mdesc mtemp, *mdptemp; - if (mdp != NULL) { /* Remove the heap from the linked list of heaps attached by mmalloc */ - mdptemp = __mmalloc_default_mdp; + struct mdesc* mdptemp = __mmalloc_default_mdp; while(mdptemp->next_mdesc != mdp ) mdptemp = mdptemp->next_mdesc; mdptemp->next_mdesc = mdp->next_mdesc; xbt_mheap_destroy_no_free(mdp); - mtemp = *mdp; + struct mdesc mtemp = *mdp; /* Now unmap all the pages associated with this region by asking for a negative increment equal to the current size of the region. */ if (mmorecore(&mtemp, (char *)mtemp.base - (char *)mtemp.breakval) == NULL) { - /* Deallocating failed. Update the original malloc descriptor - with any changes */ + /* Deallocating failed. Update the original malloc descriptor with any changes */ *mdp = mtemp; } else { if (mtemp.flags & MMALLOC_DEVZERO) { @@ -277,8 +269,7 @@ void *xbt_mheap_destroy(xbt_mheap_t mdp) } /* Safety gap from the heap's break address. - * Try to increase this first if you experience strange errors under - * valgrind. */ + * 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) @@ -333,12 +324,10 @@ void *mmalloc_preinit(void) 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); @@ -390,32 +379,3 @@ ssize_t mmalloc_get_busy_size(xbt_mheap_t heap, void *ptr){ } } - -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."); - } - } - } -}