1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
/*
TEST_HEADER
id = $Id$
summary = MFS functional test allocate and free in manual fixed small pool
language = c
link = testlib.o
END_HEADER
*/
#include <time.h>
#include "testlib.h"
#include "mpscmfs.h"
#define MAXNUMBER 1000000
mps_arena_t arena;
static mps_addr_t queue[MAXNUMBER];
enum {SEQ=0, RAN=1, SEQGAP=2, RANGAP=3};
static char *tdesc[] = {"sequential", "random",
"sequential gap", "random gap"};
static void dotest(int kind, size_t unitSize, size_t extendBy,
int number, int iter)
{
mps_pool_t pool;
int i, hd;
clock_t time0, time1;
double secs;
asserts(number <= MAXNUMBER, "number too big");
asserts(unitSize >= sizeof(int), "unitSize too small");
time0 = clock();
asserts(time0 != -1, "processor time not available");
die(
mps_pool_create(&pool, arena, mps_class_mfs(), extendBy, unitSize),
"create pool");
for(hd=0; hd<number; hd++)
{
if (ranint(2) && (kind & 2))
{
queue[hd]=NULL;
}
else
{
mps_alloc(&queue[hd], pool, unitSize);
*((int *) queue[hd])=hd;
}
};
hd=-1;
for(i=0; i<iter; i++)
{
if (kind & 1) hd = ranint(number);
else {ranint(number); hd=(hd+1)%number;} /* call raninit anyway
to use same time */
asserts(queue[hd]==NULL || *((int*) queue[hd])==hd,
"corrupt object (%s: %x, %x, %i, %i)",
tdesc[kind], unitSize, extendBy, number, iter);
if (queue[hd] != NULL) mps_free(pool, queue[hd], unitSize);
if (ranint(2) && (kind & 2))
{
queue[hd]=NULL;
}
else
{
mps_alloc(&queue[hd], pool, unitSize);
*((int *) queue[hd])=hd;
}
}
mps_pool_destroy(pool);
time1=clock();
secs=(time1-time0)/(double)CLOCKS_PER_SEC;
comment("%s test (%x, %x, %i, %i) in %.2f s",
tdesc[kind], (int) extendBy, (int) unitSize, number, iter, secs);
}
static void test(void *stack_pointer)
{
mps_thr_t thread;
cdie(mps_arena_create(&arena, mps_arena_class_vm(), mmqaArenaSIZE), "create arena");
cdie(mps_thread_reg(&thread, arena), "register thread");
dotest(SEQ, 8, 8, 1000, 10000);
dotest(RAN, 8, 8, 1000, 10000);
dotest(SEQGAP, 8, 8, 1000, 10000);
dotest(RANGAP, 8, 8, 1000, 10000);
dotest(SEQ, 8, 8, 10000, 0);
dotest(SEQ, 8, 4096, 10000, 0); /* 4 K */
dotest(SEQ, 8, 8192, 10000, 0); /* 8 K */
dotest(SEQ, 8, 16384, 10000, 0); /* 16 K */
dotest(SEQ, 8, 32768, 10000, 0); /* 32 K */
dotest(SEQ, 8, 65536, 10000, 0); /* 64 K */
dotest(SEQ, 8, 131072, 10000, 0); /* 128 K */
dotest(SEQ, 8, 8, 100000, 0);
dotest(SEQ, 8, 4096, 100000, 0); /* 4 K */
dotest(SEQ, 8, 8192, 100000, 0); /* 8 K */
dotest(SEQ, 8, 16384, 100000, 0); /* 16 K */
dotest(SEQ, 8, 32768, 100000, 0); /* 32 K */
dotest(SEQ, 8, 65536, 100000, 0); /* 64 K */
dotest(SEQ, 8, 131072, 100000, 0); /* 128 K */
dotest(SEQ, 4, 4, 100, 10000);
dotest(SEQ, 5, 5, 100, 10000);
dotest(SEQ, 15, 15, 100, 10000);
dotest(SEQ, 64, 64, 100, 10000);
dotest(RAN, 4, 4, 100, 10000);
dotest(SEQ, 64, 64, 100, 1000);
mps_thread_dereg(thread);
mps_arena_destroy(arena);
}
int main(void)
{
run_test(test);
pass();
return 0;
}
|