/***********************************************************************1* *2* This software is part of the ast package *3* Copyright (c) 1985-2012 AT&T Intellectual Property *4* and is licensed under the *5* Eclipse Public License, Version 1.0 *6* by AT&T Intellectual Property *7* *8* A copy of the License is available at *9* http://www.eclipse.org/org/documents/epl-v10.html *10* (with md5 checksum b35adb5213ca9657e911e9befb180842) *11* *12* Information and Software Systems Research *13* AT&T Research *14* Florham Park NJ *15* *16* Glenn Fowler <[email protected]> *17* David Korn <[email protected]> *18* Phong Vo <[email protected]> *19* *20***********************************************************************/21#if defined(_UWIN) && defined(_BLD_ast)2223void _STUB_vmclose(){}2425#else2627#include "vmhdr.h"2829/* Close down a region.30**31** Written by Kiem-Phong Vo, [email protected], 01/16/94.32*/33#if __STD_C34int vmclose(Vmalloc_t* vm)35#else36int vmclose(vm)37Vmalloc_t* vm;38#endif39{40Seg_t *seg, *vmseg, *next;41Vmalloc_t *v, *last;42Vmdata_t* vd = vm->data;43Vmdisc_t* disc = vm->disc;44int mode, rv = 0;4546if(vm == Vmheap) /* the heap is never freed */47return -1;4849if(vm->disc->exceptf && /* announcing closing event */50(rv = (*vm->disc->exceptf)(vm,VM_CLOSE,(Void_t*)1,vm->disc)) < 0 )51return -1;5253mode = vd->mode; /* remember this in case it gets destroyed below */5455if((mode&VM_MTPROFILE) && _Vmpfclose)56(*_Vmpfclose)(vm);5758/* remove from linked list of regions */59_vmlock(NIL(Vmalloc_t*), 1);60for(last = Vmheap, v = last->next; v; last = v, v = v->next)61{ if(v == vm)62{ last->next = v->next;63break;64}65}66_vmlock(NIL(Vmalloc_t*), 0);6768if(rv == 0) /* deallocate memory obtained from the system */69{ /* lock-free because alzheimer can cause deadlocks :) */70vmseg = NIL(Seg_t*);71for(seg = vd->seg; seg; seg = next)72{ next = seg->next;73if(seg->extent == seg->size) /* root segment */74vmseg = seg; /* don't free this yet */75else (*disc->memoryf)(vm,seg->addr,seg->extent,0,disc);76}77if(vmseg) /* now safe to free root segment */78(*disc->memoryf)(vm,vmseg->addr,vmseg->extent,0,disc);79}8081if(disc->exceptf) /* finalizing closing */82(void)(*disc->exceptf)(vm, VM_ENDCLOSE, (Void_t*)0, disc);8384if(!(mode & VM_MEMORYF) )85vmfree(Vmheap,vm);8687return 0;88}8990#endif919293