xref: /titanic_50/usr/src/lib/libast/common/vmalloc/vmclose.c (revision c9a6ea2e938727c95af7108c5e00eee4c890c7ae)
1 /***********************************************************************
2 *                                                                      *
3 *               This software is part of the ast package               *
4 *          Copyright (c) 1985-2010 AT&T Intellectual Property          *
5 *                      and is licensed under the                       *
6 *                  Common Public License, Version 1.0                  *
7 *                    by AT&T Intellectual Property                     *
8 *                                                                      *
9 *                A copy of the License is available at                 *
10 *            http://www.opensource.org/licenses/cpl1.0.txt             *
11 *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12 *                                                                      *
13 *              Information and Software Systems Research               *
14 *                            AT&T Research                             *
15 *                           Florham Park NJ                            *
16 *                                                                      *
17 *                 Glenn Fowler <gsf@research.att.com>                  *
18 *                  David Korn <dgk@research.att.com>                   *
19 *                   Phong Vo <kpv@research.att.com>                    *
20 *                                                                      *
21 ***********************************************************************/
22 #if defined(_UWIN) && defined(_BLD_ast)
23 
24 void _STUB_vmclose(){}
25 
26 #else
27 
28 #include	"vmhdr.h"
29 
30 /*	Close down a region.
31 **
32 **	Written by Kiem-Phong Vo, kpv@research.att.com, 01/16/94.
33 */
34 #if __STD_C
35 int vmclose(Vmalloc_t* vm)
36 #else
37 int vmclose(vm)
38 Vmalloc_t*	vm;
39 #endif
40 {
41 	Seg_t		*seg, *vmseg, *next;
42 	Vmalloc_t	*v, *last;
43 	Vmdata_t*	vd = vm->data;
44 	int		ev = 0;
45 
46 	if(vm == Vmheap)
47 		return -1;
48 
49 	if(!(vd->mode&VM_TRUST) && ISLOCK(vd,0))
50 		return -1;
51 
52 	if(vm->disc->exceptf &&
53 	   (ev = (*vm->disc->exceptf)(vm,VM_CLOSE,NIL(Void_t*),vm->disc)) < 0 )
54 		return -1;
55 
56 	/* make this region inaccessible until it disappears */
57 	vd->mode &= ~VM_TRUST;
58 	SETLOCK(vd,0);
59 
60 	if((vd->mode&VM_MTPROFILE) && _Vmpfclose)
61 		(*_Vmpfclose)(vm);
62 
63 	/* remove from linked list of regions	*/
64 	for(last = Vmheap, v = last->next; v; last = v, v = v->next)
65 	{	if(v == vm)
66 		{	last->next = v->next;
67 			break;
68 		}
69 	}
70 
71 	if(ev == 0)
72 	{	vmseg = NIL(Seg_t*);
73 		for(seg = vd->seg; seg; seg = next)
74 		{	next = seg->next;
75 			if(seg->extent == seg->size)
76 				vmseg = seg;
77 			else	(*vm->disc->memoryf)(vm,seg->addr,seg->extent,0,vm->disc);
78 		}
79 		if(vmseg)
80 			(*vm->disc->memoryf)(vm,vmseg->addr,vmseg->extent,0,vm->disc);
81 	}
82 	else	CLRLOCK(vd,0);
83 
84 	vmfree(Vmheap,vm);
85 
86 	return 0;
87 }
88 
89 #endif
90