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