From 39fbe9bcbc6f5ae16bf2fc5e6d1f97ca73519ca2 Mon Sep 17 00:00:00 2001 From: David Moore Date: Mon, 5 Feb 1996 14:44:40 +0000 Subject: [PATCH] New unit New interface Copied from Perforce Change: 15169 ServerID: perforce.ravenbrook.com --- mps/src/amcss.c | 325 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 325 insertions(+) create mode 100644 mps/src/amcss.c diff --git a/mps/src/amcss.c b/mps/src/amcss.c new file mode 100644 index 00000000000..5f1a314e998 --- /dev/null +++ b/mps/src/amcss.c @@ -0,0 +1,325 @@ +/* ==== POOL CLASS AMC TEST ==== + * + * $HopeName: MMsrc!amcdev.c(trunk.4) $ + * + * Copyright (C) 1995 Harlequin Group, all rights reserved + * + * This is a unit stress test for the AMC pool class. It uses a simple + * object format to do a few collections. It's a bit of a hack at the + * moment. + */ + +#include "mps.h" +#include "std.h" +#include "lib.h" +#include "deque.h" +#include "space.h" +#include "root.h" +#include "trace.h" +#include "format.h" +#include "pool.h" +#include "amc.h" +#include "buffer.h" +#include "coll.h" +#include "prot.h" +#include "testlib.h" +#include +#include +#include +#include +#include + + +#define NR_EXACT_ROOTS 50 +#define NR_AMBIG_ROOTS 50 +#define FIELDS_MAX 2000 +#define OBJECTS 4000 +#define OBJECT_ALIGN sizeof(mps_addr_t *) + + +static mps_pool_t pool; +static mps_ap_t buffer; +static mps_addr_t exactRoots[NR_EXACT_ROOTS]; +static mps_addr_t ambigRoots[NR_AMBIG_ROOTS]; +static mps_word_t name = 0xA << (ADDRWIDTH-4); + + +#define OBJHERE(object) (((object)[0] & 1uL) == 1uL) +#define OBJHEAD(object) ((object)[0]) +#define OBJFIELDS(object) ((object)[0] >> 1) +#define OBJFIELD(object, n) ((object)[2+(n)]) +#define OBJNAME(object) ((object)[1]) +#define OBJSUM(object) checksum(object, OBJFIELDS(object)+2) + + +static unsigned long invrnd(unsigned long n) +{ + return n/((rnd()%n)+1)-1; +} + + +static mps_word_t checksum(mps_word_t *base, mps_word_t size) +{ + mps_word_t sum = 0xBA5E5EED; + + while(size--) + sum += (mps_word_t)*base++; + + return sum; +} + + +static mps_bool_t probe(mps_addr_t where) +{ + mps_word_t *object; + mps_word_t fields, i; + + if(PoolHasAddr((Pool)pool, (Addr)where) && + IsAligned(OBJECT_ALIGN, (Addr)where)) + { + object = (mps_word_t *)where; + if(OBJHERE(object)) + { + fields = OBJFIELDS(object); + if(fields <= FIELDS_MAX && + PoolHasAddr((Pool)pool, (Addr)&OBJFIELD(object, fields))) + { + for(i=0; i