X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8868f3e0668d8278936a3c79bae72a485b03d8c8..a21b6634a89ef18ffdbde0607b410f8e59d169c3:/src/xbt/mmalloc/detach.c diff --git a/src/xbt/mmalloc/detach.c b/src/xbt/mmalloc/detach.c index 4c6e45961e..43e1ab392f 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,34 +28,39 @@ 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. */ -void* -mmalloc_detach (void *md) +void mmalloc_pre_detach(void *md) +{ + struct mdesc *mdp = md; + xbt_os_mutex_t mutex = mdp->mutex; + mdp->mutex = NULL; + xbt_os_mutex_destroy(mutex); +} + +void *mmalloc_detach(void *md) { struct mdesc mtemp; - if (md != NULL) - { + if (md != NULL) { + + 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. */ - 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; - } + 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); }