2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: vmclose.c /main/2 1996/05/08 20:01:42 drk $ */
24 /***************************************************************
26 * AT&T - PROPRIETARY *
28 * THIS IS PROPRIETARY SOURCE CODE LICENSED BY *
31 * Copyright (c) 1995 AT&T Corp. *
32 * All Rights Reserved *
34 * This software is licensed by AT&T Corp. *
35 * under the terms and conditions of the license in *
36 * http://www.research.att.com/orgs/ssr/book/reuse *
38 * This software was created by the *
39 * Software Engineering Research Department *
40 * AT&T Bell Laboratories *
42 * For further information contact *
43 * gsf@research.att.com *
45 ***************************************************************/
48 /* Close down a region.
50 ** Written by (Kiem-)Phong Vo, kpv@research.att.com, 01/16/94.
53 vmclose(Vmalloc_t* vm)
59 reg Seg_t *seg, *vmseg;
60 reg Vmemory_f memoryf;
61 reg Vmdata_t* vd = vm->data;
66 if(!(vd->mode&VM_TRUST) && ISLOCK(vd,0))
69 if(vm->disc->exceptf &&
70 (*vm->disc->exceptf)(vm,VM_CLOSE,NIL(Void_t*),vm->disc) < 0)
73 /* make this region inaccessible until it disappears */
74 vd->mode &= ~VM_TRUST;
77 if((vd->mode&VM_MTPROFILE) && _Vmpfclose)
80 /* free all non-region segments */
81 memoryf = vm->disc->memoryf;
83 for(seg = vd->seg; seg; )
84 { reg Seg_t* next = seg->next;
85 if(seg->extent != seg->size)
86 (void)(*memoryf)(vm,seg->addr,seg->extent,0,vm->disc);
91 /* this must be done here because even though this region is freed,
92 there may still be others that share this space.
96 /* free the segment that contains the region data */
98 (void)(*memoryf)(vm,vmseg->addr,vmseg->extent,0,vm->disc);
100 /* free the region itself */