X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/34fe2541425db4576e9ec1288241e4da80298f1c..1189d1797cc934d847d6641d809bbe060729f064:/src/xbt/mmalloc/detach.c diff --git a/src/xbt/mmalloc/detach.c b/src/xbt/mmalloc/detach.c index b5b5092057..e1157ed081 100644 --- a/src/xbt/mmalloc/detach.c +++ b/src/xbt/mmalloc/detach.c @@ -2,25 +2,15 @@ Copyright 1992 Free Software Foundation, Inc. Contributed by Fred Fish at Cygnus Support. fnf@cygnus.com + This file was then part of the GNU C Library. */ -This file is part of the GNU C Library. +/* Copyright (c) 2010. The SimGrid Team. + * All rights reserved. */ -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. +/* 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. */ -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include /* close */ +#include /* close */ #include #include "mmprivate.h" @@ -38,35 +28,48 @@ Boston, MA 02111-1307, USA. */ region we are about to unmap, so we first make a local copy of it on the stack and use the copy. */ -PTR -mmalloc_detach (md) - PTR md; +void mmalloc_pre_detach(void *md) +{ + struct mdesc *mdp = md; + + if(--mdp->refcount == 0){ + LOCK(mdp) ; + sem_destroy(&mdp->sem); + } +} + +void *mmalloc_detach(void *md) { - struct mdesc mtemp; - - if (md != NULL) - { - - 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; - } + 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); }