From 9f7a7029957700b3e486ba4f415a03e5bb0fc28f Mon Sep 17 00:00:00 2001 From: Richard Tucker Date: Wed, 14 Jan 1998 16:37:30 +0000 Subject: [PATCH] New unit new format Copied from Perforce Change: 19217 ServerID: perforce.ravenbrook.com --- mps/qa/test/testlib/epvmfmt.c | 121 ++++++++++++++++++++++++++++++++++ mps/qa/test/testlib/epvmfmt.h | 35 ++++++++++ 2 files changed, 156 insertions(+) create mode 100644 mps/qa/test/testlib/epvmfmt.c create mode 100644 mps/qa/test/testlib/epvmfmt.h diff --git a/mps/qa/test/testlib/epvmfmt.c b/mps/qa/test/testlib/epvmfmt.c new file mode 100644 index 00000000000..c67af49f080 --- /dev/null +++ b/mps/qa/test/testlib/epvmfmt.c @@ -0,0 +1,121 @@ +/* epvmfmt.c +*/ + +#include "mps.h" +#include "testlib.h" +#include "epvmfmt.h" +#include + +int alloccomments = 0; + +/* the scanning function doesn't try to fix null refs +*/ + +static mps_res_t epvmscan(mps_ss_t ss, mps_addr_t base, mps_addr_t limit); + +mps_addr_t epvmskip(mps_addr_t object) { + error("skip called on EPVM object: %p", object); + return NULL; +} + +void epvmfwd(mps_addr_t object, mps_addr_t to) { + error("fwd called on EPVM object: %p -> %p", object, to); +} + +mps_addr_t epvmisfwd(mps_addr_t object) { + error("isfwd called on EPVM object: %p", object); + return NULL; +} + +void epvmcopy(mps_addr_t object, mps_addr_t to) { + error("copy called on EPVM object: %p -> %p", object, to); +} + +void epvmpad(mps_addr_t base, size_t size) { + error("pad called in EPVM: %p, %u", base, size); +} + +struct mps_fmt_A_s fmtepvm = +{ + (mps_align_t) 8, + &epvmscan, + &epvmskip, + &epvmcopy, + &epvmfwd, + &epvmisfwd, + &epvmpad +}; + +/* in the following, size is the number of words you want + to allocate +*/ + +psobj *allocepvm(mps_ap_t ap, int size) { + mps_addr_t p; + psobj *q; + int i; + size_t bytes; + + asserts(sizeof(struct psobj) == 8, "Aaarg! How can EPVM pools possibly work"); + bytes = size*8; + + asserts(size > 0, "allocepvm with zero size"); + + do + { + die(mps_reserve(&p, ap, bytes), "Reserve: "); + q=p; + + for(i=0; iobj = NULL; + (q+i)->size = 0; + } + } + while (!mps_commit(ap, p, bytes)); + commentif(alloccomments, "allocated %p.", q); + + return q; +} + +void splatepvm(psobj *obj) { + obj->size = 0; +} + +mps_bool_t issplatepvm(psobj *obj) { + return (obj->size == 0); +} + +static mps_res_t epvmscan(mps_ss_t ss, mps_addr_t base, mps_addr_t limit) +{ + unsigned int i; + + MPS_SCAN_BEGIN(ss) + { + while (base < limit) + { + psobj *obj = base; + mps_res_t res; + mps_addr_t p; + + asserts(obj->size > 0, "scan on splatted object at %p", obj); + + p = obj->obj; + asserts(p != NULL, "NULL pointer in EPVM obj at %p", obj); + res = MPS_FIX(ss, (mps_addr_t *) &p); /* A ghastly PUN! */ + if (res != MPS_RES_OK) return res; + asserts(p != NULL, "reference in EPVM fixed to NULL at %p", obj); + obj->obj = p; + + for (i=1; isize; i++) { + p = obj->obj + i; + res = MPS_FIX(ss, (mps_addr_t *) &p); + if (res != MPS_RES_OK) return res; + asserts(p == obj->obj+i, "reference in EPVM changed at %p", obj); + } + } + } + MPS_SCAN_END(ss); + return MPS_RES_OK; +} + diff --git a/mps/qa/test/testlib/epvmfmt.h b/mps/qa/test/testlib/epvmfmt.h new file mode 100644 index 00000000000..267a28c19eb --- /dev/null +++ b/mps/qa/test/testlib/epvmfmt.h @@ -0,0 +1,35 @@ +/* epvmfmt.h + Format for objects in the EPVM pool. +*/ + +#ifndef epvmfmt_h +#define epvmfmt_h + +#include "mps.h" + +extern int alloccomments; + +/* the counters are visible so that I can check whether things + get moved etc +*/ + +/* the object format is visible so tests that want to + can hack around with it +*/ + + +typedef struct psobj { + mps_addr_t *obj; + mps_word_t size; +} psobj; + +extern struct mps_fmt_A_s fmtepvm; + +psobj *allocepvm(mps_ap_t ap, int words); + +void splatepvm(psobj *obj); + +mps_bool_t issplatepvm(psobj *obj); + +#endif +