1*b30d1939SAndy Fiddaman /***********************************************************************
2*b30d1939SAndy Fiddaman *                                                                      *
3*b30d1939SAndy Fiddaman *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1985-2012 AT&T Intellectual Property          *
5*b30d1939SAndy Fiddaman *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
7*b30d1939SAndy Fiddaman *                    by AT&T Intellectual Property                     *
8*b30d1939SAndy Fiddaman *                                                                      *
9*b30d1939SAndy Fiddaman *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12*b30d1939SAndy Fiddaman *                                                                      *
13*b30d1939SAndy Fiddaman *              Information and Software Systems Research               *
14*b30d1939SAndy Fiddaman *                            AT&T Research                             *
15*b30d1939SAndy Fiddaman *                           Florham Park NJ                            *
16*b30d1939SAndy Fiddaman *                                                                      *
17*b30d1939SAndy Fiddaman *                 Glenn Fowler <gsf@research.att.com>                  *
18*b30d1939SAndy Fiddaman *                  David Korn <dgk@research.att.com>                   *
19*b30d1939SAndy Fiddaman *                   Phong Vo <kpv@research.att.com>                    *
20*b30d1939SAndy Fiddaman *                                                                      *
21*b30d1939SAndy Fiddaman ***********************************************************************/
22*b30d1939SAndy Fiddaman #if defined(_UWIN) && defined(_BLD_ast)
23*b30d1939SAndy Fiddaman 
_STUB_vmstat()24*b30d1939SAndy Fiddaman void _STUB_vmstat(){}
25*b30d1939SAndy Fiddaman 
26*b30d1939SAndy Fiddaman #else
27*b30d1939SAndy Fiddaman 
28*b30d1939SAndy Fiddaman #include	"vmhdr.h"
29*b30d1939SAndy Fiddaman 
30*b30d1939SAndy Fiddaman /*	Get statistics from a region.
31*b30d1939SAndy Fiddaman **
32*b30d1939SAndy Fiddaman **	Written by Kiem-Phong Vo, kpv@research.att.com, 01/16/94.
33*b30d1939SAndy Fiddaman */
34*b30d1939SAndy Fiddaman 
35*b30d1939SAndy Fiddaman #if __STD_C
vmstat(Vmalloc_t * vm,Vmstat_t * st)36*b30d1939SAndy Fiddaman int vmstat(Vmalloc_t* vm, Vmstat_t* st)
37*b30d1939SAndy Fiddaman #else
38*b30d1939SAndy Fiddaman int vmstat(vm, st)
39*b30d1939SAndy Fiddaman Vmalloc_t*	vm;
40*b30d1939SAndy Fiddaman Vmstat_t*	st;
41*b30d1939SAndy Fiddaman #endif
42*b30d1939SAndy Fiddaman {
43*b30d1939SAndy Fiddaman 	size_t		s;
44*b30d1939SAndy Fiddaman 	Seg_t		*seg;
45*b30d1939SAndy Fiddaman 	Block_t		*b, *endb;
46*b30d1939SAndy Fiddaman 	Vmdata_t	*vd;
47*b30d1939SAndy Fiddaman 	Void_t		*d;
48*b30d1939SAndy Fiddaman 
49*b30d1939SAndy Fiddaman 	if(!st) /* just checking lock state of region */
50*b30d1939SAndy Fiddaman 		return (vm ? vm : Vmregion)->data->lock;
51*b30d1939SAndy Fiddaman 
52*b30d1939SAndy Fiddaman 	memset(st, 0, sizeof(Vmstat_t));
53*b30d1939SAndy Fiddaman 
54*b30d1939SAndy Fiddaman 	if(!vm)
55*b30d1939SAndy Fiddaman 	{	/* getting data for malloc */
56*b30d1939SAndy Fiddaman #if ( !_std_malloc || !_BLD_ast ) && !_AST_std_malloc
57*b30d1939SAndy Fiddaman 		extern int	_mallocstat(Vmstat_t*);
58*b30d1939SAndy Fiddaman 		return _mallocstat(st);
59*b30d1939SAndy Fiddaman #else
60*b30d1939SAndy Fiddaman 		return -1;
61*b30d1939SAndy Fiddaman #endif
62*b30d1939SAndy Fiddaman 	}
63*b30d1939SAndy Fiddaman 
64*b30d1939SAndy Fiddaman 	SETLOCK(vm, 0);
65*b30d1939SAndy Fiddaman 
66*b30d1939SAndy Fiddaman 	st->n_busy = st->n_free = 0;
67*b30d1939SAndy Fiddaman 	st->s_busy = st->s_free = st->m_busy = st->m_free = 0;
68*b30d1939SAndy Fiddaman 	st->n_seg = 0;
69*b30d1939SAndy Fiddaman 	st->extent = 0;
70*b30d1939SAndy Fiddaman 
71*b30d1939SAndy Fiddaman 	vd = vm->data;
72*b30d1939SAndy Fiddaman 	st->mode = vd->mode;
73*b30d1939SAndy Fiddaman 	s = 0;
74*b30d1939SAndy Fiddaman 	if(vd->mode&VM_MTLAST)
75*b30d1939SAndy Fiddaman 		st->n_busy = 0;
76*b30d1939SAndy Fiddaman 	else if((vd->mode&VM_MTPOOL) && (s = vd->pool) > 0)
77*b30d1939SAndy Fiddaman 	{	s = ROUND(s,ALIGN);
78*b30d1939SAndy Fiddaman 		for(b = vd->free; b; b = SEGLINK(b))
79*b30d1939SAndy Fiddaman 			st->n_free += 1;
80*b30d1939SAndy Fiddaman 	}
81*b30d1939SAndy Fiddaman 
82*b30d1939SAndy Fiddaman 	for(seg = vd->seg; seg; seg = seg->next)
83*b30d1939SAndy Fiddaman 	{	st->n_seg += 1;
84*b30d1939SAndy Fiddaman 		st->extent += seg->extent;
85*b30d1939SAndy Fiddaman 
86*b30d1939SAndy Fiddaman 		b = SEGBLOCK(seg);
87*b30d1939SAndy Fiddaman 		endb = BLOCK(seg->baddr);
88*b30d1939SAndy Fiddaman 
89*b30d1939SAndy Fiddaman 		if(vd->mode&(VM_MTDEBUG|VM_MTBEST|VM_MTPROFILE))
90*b30d1939SAndy Fiddaman 		{	while(b < endb)
91*b30d1939SAndy Fiddaman 			{	s = SIZE(b)&~BITS;
92*b30d1939SAndy Fiddaman 				if(ISJUNK(SIZE(b)) || !ISBUSY(SIZE(b)))
93*b30d1939SAndy Fiddaman 				{	if(s > st->m_free)
94*b30d1939SAndy Fiddaman 						st->m_free = s;
95*b30d1939SAndy Fiddaman 					st->s_free += s;
96*b30d1939SAndy Fiddaman 					st->n_free += 1;
97*b30d1939SAndy Fiddaman 				}
98*b30d1939SAndy Fiddaman 				else	/* get the real size */
99*b30d1939SAndy Fiddaman 				{	d = DATA(b);
100*b30d1939SAndy Fiddaman 					if(vd->mode&VM_MTDEBUG)
101*b30d1939SAndy Fiddaman 						s = DBSIZE(DB2DEBUG(d));
102*b30d1939SAndy Fiddaman 					else if(vd->mode&VM_MTPROFILE)
103*b30d1939SAndy Fiddaman 						s = PFSIZE(d);
104*b30d1939SAndy Fiddaman 					if(s > st->m_busy)
105*b30d1939SAndy Fiddaman 						st->m_busy = s;
106*b30d1939SAndy Fiddaman 					st->s_busy += s;
107*b30d1939SAndy Fiddaman 					st->n_busy += 1;
108*b30d1939SAndy Fiddaman 				}
109*b30d1939SAndy Fiddaman 
110*b30d1939SAndy Fiddaman 				b = (Block_t*)((Vmuchar_t*)DATA(b) + (SIZE(b)&~BITS) );
111*b30d1939SAndy Fiddaman 			}
112*b30d1939SAndy Fiddaman 			/**/ASSERT(st->extent >= (st->s_busy + st->s_free));
113*b30d1939SAndy Fiddaman 		}
114*b30d1939SAndy Fiddaman 		else if(vd->mode&VM_MTLAST)
115*b30d1939SAndy Fiddaman 		{	if((s = seg->free ? (SIZE(seg->free) + sizeof(Head_t)) : 0) > 0)
116*b30d1939SAndy Fiddaman 			{	st->s_free += s;
117*b30d1939SAndy Fiddaman 				st->n_free += 1;
118*b30d1939SAndy Fiddaman 			}
119*b30d1939SAndy Fiddaman 			if((s = ((char*)endb - (char*)b) - s) > 0)
120*b30d1939SAndy Fiddaman 			{	st->s_busy += s;
121*b30d1939SAndy Fiddaman 				st->n_busy += 1;
122*b30d1939SAndy Fiddaman 			}
123*b30d1939SAndy Fiddaman 		}
124*b30d1939SAndy Fiddaman 		else if((vd->mode&VM_MTPOOL) && s > 0)
125*b30d1939SAndy Fiddaman 		{	if(seg->free)
126*b30d1939SAndy Fiddaman 				st->n_free += (SIZE(seg->free)+sizeof(Head_t))/s;
127*b30d1939SAndy Fiddaman 			st->n_busy += ((seg->baddr - (Vmuchar_t*)b) - sizeof(Head_t))/s;
128*b30d1939SAndy Fiddaman 		}
129*b30d1939SAndy Fiddaman 	}
130*b30d1939SAndy Fiddaman 
131*b30d1939SAndy Fiddaman 	if((vd->mode&VM_MTPOOL) && s > 0)
132*b30d1939SAndy Fiddaman 	{	st->n_busy -= st->n_free;
133*b30d1939SAndy Fiddaman 		if(st->n_busy > 0)
134*b30d1939SAndy Fiddaman 			st->s_busy = (st->m_busy = vd->pool)*st->n_busy;
135*b30d1939SAndy Fiddaman 		if(st->n_free > 0)
136*b30d1939SAndy Fiddaman 			st->s_free = (st->m_free = vd->pool)*st->n_free;
137*b30d1939SAndy Fiddaman 	}
138*b30d1939SAndy Fiddaman 
139*b30d1939SAndy Fiddaman 	CLRLOCK(vm, 0);
140*b30d1939SAndy Fiddaman 
141*b30d1939SAndy Fiddaman 	return 0;
142*b30d1939SAndy Fiddaman }
143*b30d1939SAndy Fiddaman 
144*b30d1939SAndy Fiddaman #endif
145