X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/34fe2541425db4576e9ec1288241e4da80298f1c..d78311982007a2c778ff692c35c9d2787642c199:/src/xbt/mmalloc/detach.c diff --git a/src/xbt/mmalloc/detach.c b/src/xbt/mmalloc/detach.c index b5b5092057..8df6e5e827 100644 --- a/src/xbt/mmalloc/detach.c +++ b/src/xbt/mmalloc/detach.c @@ -2,28 +2,32 @@ 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" +/* Terminate access to a mmalloc managed region, but do not free its content. + * This is for example useful for the base region where ldl stores its data + * because it leaves the place after us. + */ +void mmalloc_detach_no_free(void *md) +{ + struct mdesc *mdp = md; + + if(--mdp->refcount == 0){ + LOCK(mdp) ; + sem_destroy(&mdp->sem); + } +} + /* 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. @@ -38,35 +42,38 @@ 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_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_detach_no_free(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 ((mmorecore(&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); }