X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4c04d8355923f8323a1a3195fe3b73ac08b984ea..779e0e58a8ec8674bef9f53c0f80ea021a4f5063:/src/xbt/mmalloc/detach.c diff --git a/src/xbt/mmalloc/detach.c b/src/xbt/mmalloc/detach.c index dbf4d34b29..e1157ed081 100644 --- a/src/xbt/mmalloc/detach.c +++ b/src/xbt/mmalloc/detach.c @@ -10,7 +10,7 @@ /* 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. */ -#include /* close */ +#include /* close */ #include #include "mmprivate.h" @@ -28,35 +28,48 @@ region we are about to unmap, so we first make a local copy of it on the stack and use the copy. */ -void* -mmalloc_detach (void *md) +void mmalloc_pre_detach(void *md) { - struct mdesc mtemp; - - if (md != NULL) - { - - mtemp = *(struct mdesc *) md; - xbt_os_mutex_destroy(((struct mdesc*)md)->mutex); - - /* Now unmap all the pages associated with this region by asking for a - negative increment equal to the current size of the region. */ - - if ((mtemp.morecore (&mtemp, (char*)mtemp.base - (char*)mtemp.breakval)) == NULL) - { - /* Deallocating failed. Update the original malloc descriptor - with any changes */ - *(struct mdesc *) md = mtemp; - } - else - { - if (mtemp.flags & MMALLOC_DEVZERO) - { - close (mtemp.fd); - } - md = NULL; - } + struct mdesc *mdp = md; + + if(--mdp->refcount == 0){ + LOCK(mdp) ; + sem_destroy(&mdp->sem); + } +} + +void *mmalloc_detach(void *md) +{ + struct mdesc *mdp = (struct mdesc *)md; + struct mdesc mtemp, *mdptemp; + + if (mdp != NULL) { + /* Remove the heap from the linked list of heaps attached by mmalloc */ + mdptemp = __mmalloc_default_mdp; + while(mdptemp->next_mdesc != mdp ) + mdptemp = mdptemp->next_mdesc; + + mdptemp->next_mdesc = mdp->next_mdesc; + + mmalloc_pre_detach(md); + mtemp = *(struct mdesc *) md; + + /* Now unmap all the pages associated with this region by asking for a + negative increment equal to the current size of the region. */ + + if ((mtemp.morecore(&mtemp, + (char *) mtemp.base - (char *) mtemp.breakval)) == + NULL) { + /* Deallocating failed. Update the original malloc descriptor + with any changes */ + *(struct mdesc *) md = mtemp; + } else { + if (mtemp.flags & MMALLOC_DEVZERO) { + close(mtemp.fd); + } + md = NULL; } + } return (md); }