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 <unistd.h> /* close */
+#include <unistd.h> /* close */
#include <sys/types.h>
#include "mmprivate.h"
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;
+
+ 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);
}