Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/tests/vmalloc/trandom.c
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1999-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* *
19
***********************************************************************/
20
#include "vmtest.h"
21
22
#define RAND() random()
23
24
typedef struct _obj_s Obj_t;
25
struct _obj_s
26
{ Void_t* obj; /* allocated object */
27
size_t size; /* its allocated size */
28
Obj_t* next; /* linked list pointer */
29
};
30
31
#define N_OBJ 500000 /* #iterations and #objects */
32
static Obj_t Obj[N_OBJ], *List[N_OBJ+1];
33
34
#define Z_HUGE 5000 /* huge block size increment */
35
#define Z_BIG 10000 /* size range of large objects */
36
#define Z_MED 100 /* size range of medium objects */
37
#define Z_TINY 10 /* size range of small objects */
38
39
#define ALLOCSIZE() (RAND()%100 == 0 ? (RAND()%Z_BIG + Z_BIG/2 ) : \
40
RAND()%10 == 0 ? (RAND()%Z_MED + Z_MED ) : \
41
(RAND()%Z_TINY + 1) )
42
43
/* when to resize or free */
44
#define TM_BIG 1000 /* life range of a big block */
45
#define TM_MED 10 /* life range of a medium block */
46
#define TM_TINY 5 /* life range of a tiny block */
47
#define TMRANGE(zz) (zz >= Z_BIG ? TM_BIG : zz >= Z_MED ? TM_MED : TM_TINY )
48
#define TIME(nk,kk,zz) ((nk = kk + (RAND() % TMRANGE(zz)) + 1), \
49
(nk = nk <= kk ? kk+1 : nk > N_OBJ ? N_OBJ : nk ) )
50
51
#define COMPACT(kk) ((kk % (N_OBJ/5000)) == 0 ? 1 : 0)
52
#define RESIZE(kk) ((kk % (N_OBJ/500)) == 0 ? 1 : 0)
53
54
tmain()
55
{
56
Obj_t *o, *next;
57
Void_t *huge;
58
size_t hugesz;
59
Vmstat_t sb;
60
ssize_t k, p;
61
62
srandom(0);
63
64
hugesz = Z_HUGE; /* one huge block to be resized occasionally */
65
if(!(huge = vmalloc(Vmregion, hugesz)) )
66
terror("Can't allocate block");
67
68
for(k = 0; k < N_OBJ; ++k)
69
{
70
/* free/resize all on this list */
71
for(o = List[k]; o; o = next)
72
{ next = o->next;
73
74
if((RAND()%2) == 0 ) /* flip a coin to see if freeing */
75
vmfree(Vmregion, o->obj);
76
else /* resizing */
77
{ o->size = ALLOCSIZE();
78
if(!(o->obj = vmresize(Vmregion,o->obj,o->size,VM_RSMOVE)) )
79
terror("Vmresize failed");
80
TIME(p, k, o->size); /* add to a future list */
81
o->next = List[p]; List[p] = o;
82
}
83
}
84
85
if(COMPACT(k)) /* global compaction */
86
{ if(vmstat(Vmregion, &sb) < 0)
87
terror("Vmstat failed");
88
tinfo("Arena: busy=(%u,%u) free=(%u,%u) extent=%u #segs=%d",
89
sb.n_busy,sb.s_busy, sb.n_free,sb.s_free,
90
sb.extent, sb.n_seg);
91
if(vmcompact(Vmregion) < 0 )
92
terror("Vmcompact failed");
93
if(vmstat(Vmregion, &sb) < 0)
94
terror("Vmstat failed");
95
tinfo("Compact: busy=(%u,%u) free=(%u,%u) extent=%u #segs=%d",
96
sb.n_busy,sb.s_busy, sb.n_free,sb.s_free,
97
sb.extent, sb.n_seg);
98
}
99
100
if(RESIZE(k)) /* make the huge block bigger */
101
{ hugesz += Z_HUGE;
102
if(!(huge = vmresize(Vmregion, huge, hugesz, VM_RSMOVE)) )
103
terror("Bad resize of huge block");
104
}
105
106
o = Obj+k; /* allocate a new block */
107
o->size = ALLOCSIZE();
108
if(!(o->obj = vmalloc(Vmregion, o->size)) )
109
terror("Vmalloc failed");
110
TIME(p, k, o->size);
111
o->next = List[p]; List[p] = o;
112
}
113
114
if(vmdbcheck(Vmregion) < 0)
115
terror("Corrupted region");
116
117
if(vmstat(Vmregion, &sb) < 0)
118
terror("Vmstat failed");
119
tinfo("Full: Busy=(%u,%u) Free=(%u,%u) Extent=%u #segs=%d\n",
120
sb.n_busy, sb.s_busy, sb.n_free, sb.s_free, sb.extent, sb.n_seg);
121
if(vmcompact(Vmregion) < 0 )
122
terror("Vmcompact failed");
123
if(vmstat(Vmregion, &sb) < 0)
124
terror("Vmstat failed");
125
tinfo("Compact: Busy=(%u,%u) Free=(%u,%u) Extent=%u #segs=%d\n",
126
sb.n_busy, sb.s_busy, sb.n_free, sb.s_free, sb.extent, sb.n_seg);
127
128
/* now free all left-overs */
129
for(o = List[N_OBJ]; o; o = o->next)
130
vmfree(Vmregion,o->obj);
131
vmfree(Vmregion,huge);
132
133
if(vmstat(Vmregion, &sb) < 0)
134
terror("Vmstat failed");
135
tinfo("Free: Busy=(%u,%u) Free=(%u,%u) Extent=%u #segs=%d\n",
136
sb.n_busy, sb.s_busy, sb.n_free, sb.s_free, sb.extent, sb.n_seg);
137
if(vmcompact(Vmregion) < 0 )
138
terror("Vmcompact failed2");
139
if(vmstat(Vmregion, &sb) < 0)
140
terror("Vmstat failed");
141
tinfo("Compact: Busy=(%u,%u) Free=(%u,%u) Extent=%u #segs=%d\n",
142
sb.n_busy, sb.s_busy, sb.n_free, sb.s_free, sb.extent, sb.n_seg);
143
144
if(!(huge = vmalloc(Vmregion, 10)))
145
terror("Vmalloc failed");
146
if(vmstat(Vmregion, &sb) < 0)
147
terror("Vmstat failed");
148
tinfo("Small: Busy=(%u,%u) Free=(%u,%u) Extent=%u #segs=%d\n",
149
sb.n_busy, sb.s_busy, sb.n_free, sb.s_free, sb.extent, sb.n_seg);
150
151
texit(0);
152
}
153
154