Add GNU LGPL headers to all .c .C and .h files
[oweals/cde.git] / cde / programs / dtksh / ksh93 / src / lib / libast / vmalloc / vmclose.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
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)
10  * any later version.
11  *
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
16  * details.
17  *
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
22  */
23 /* $XConsortium: vmclose.c /main/2 1996/05/08 20:01:42 drk $ */
24 /***************************************************************
25 *                                                              *
26 *                      AT&T - PROPRIETARY                      *
27 *                                                              *
28 *         THIS IS PROPRIETARY SOURCE CODE LICENSED BY          *
29 *                          AT&T CORP.                          *
30 *                                                              *
31 *                Copyright (c) 1995 AT&T Corp.                 *
32 *                     All Rights Reserved                      *
33 *                                                              *
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        *
37 *                                                              *
38 *               This software was created by the               *
39 *           Software Engineering Research Department           *
40 *                    AT&T Bell Laboratories                    *
41 *                                                              *
42 *               For further information contact                *
43 *                     gsf@research.att.com                     *
44 *                                                              *
45 ***************************************************************/
46 #include        "vmhdr.h"
47
48 /*      Close down a region.
49 **
50 **      Written by (Kiem-)Phong Vo, kpv@research.att.com, 01/16/94.
51 */
52 #if __STD_C
53 vmclose(Vmalloc_t* vm)
54 #else
55 vmclose(vm)
56 Vmalloc_t*      vm;
57 #endif
58 {
59         reg Seg_t       *seg, *vmseg;
60         reg Vmemory_f   memoryf;
61         reg Vmdata_t*   vd = vm->data;
62
63         if(vm == Vmheap)
64                 return -1;
65
66         if(!(vd->mode&VM_TRUST) && ISLOCK(vd,0))
67                 return -1;
68
69         if(vm->disc->exceptf &&
70            (*vm->disc->exceptf)(vm,VM_CLOSE,NIL(Void_t*),vm->disc) < 0)
71                 return -1;
72
73         /* make this region inaccessible until it disappears */
74         vd->mode &= ~VM_TRUST;
75         SETLOCK(vd,0);
76
77         if((vd->mode&VM_MTPROFILE) && _Vmpfclose)
78                 (*_Vmpfclose)(vm);
79
80         /* free all non-region segments */
81         memoryf = vm->disc->memoryf;
82         vmseg = NIL(Seg_t*);
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);
87                 else    vmseg = seg;
88                 seg = next;
89         }
90
91         /* this must be done here because even though this region is freed,
92            there may still be others that share this space.
93         */
94         CLRLOCK(vd,0);
95
96         /* free the segment that contains the region data */
97         if(vmseg)
98                 (void)(*memoryf)(vm,vmseg->addr,vmseg->extent,0,vm->disc);
99
100         /* free the region itself */
101         vmfree(Vmheap,vm);
102
103         return 0;
104 }