From 702f2084d50772af07511b6f881c0319ed568e9a Mon Sep 17 00:00:00 2001 From: bdemsky Date: Tue, 5 Jul 2011 23:46:26 +0000 Subject: [PATCH] more changes...think it is done...just need to wire it in to the build... --- Robust/src/Runtime/bamboo/pmc_forward.c | 26 +++++++++++++++++++++++ Robust/src/Runtime/bamboo/pmc_garbage.c | 13 +++++++++++- Robust/src/Runtime/bamboo/pmc_garbage.h | 2 ++ Robust/src/Runtime/bamboo/pmc_refupdate.c | 10 +++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/Robust/src/Runtime/bamboo/pmc_forward.c b/Robust/src/Runtime/bamboo/pmc_forward.c index 41f23645..84c3e2a3 100644 --- a/Robust/src/Runtime/bamboo/pmc_forward.c +++ b/Robust/src/Runtime/bamboo/pmc_forward.c @@ -55,6 +55,32 @@ void pmc_processunits() { } } +void pmc_doforward() { + int startregion=-1; + int endregion=-1; + unsigned int totalbytes=0; + struct pmc_region * region=&pmc_heapptr->regions[BAMBOO_NUM_OF_CORE]; + for(int i=0;iunits[i].regionnum) { + startregion=i; + } + if (BAMBOO_NUM_OF_COREunits[i].regionnum) { + endregion=i; + break; + } + if (startregion!=-1) { + totalbytes+=pmc_heapptr->units[i].numbytes; + } + } + if (startregion==-1) + return; + if (endregion==-1) + endregion=NUMPMCUNITS; + region->startptr=gcbaseva+startregion*UNITSIZE; + region->endptr=gcbaseva+endregion*UNITSIZE; + pmc_forward(region, totalbytes, region->startptr, region->endptr, BAMBOO_NUM_OF_CORE&1); +} + void pmc_forward(struct pmc_region *region, unsigned int totalbytes, void *bottomptr, void *topptr, bool fwddirection) { void *tmpptr=bottomptr; diff --git a/Robust/src/Runtime/bamboo/pmc_garbage.c b/Robust/src/Runtime/bamboo/pmc_garbage.c index 6e13da82..4d0d7472 100644 --- a/Robust/src/Runtime/bamboo/pmc_garbage.c +++ b/Robust/src/Runtime/bamboo/pmc_garbage.c @@ -29,12 +29,23 @@ void pmc_init() { void gc(struct garbagelist *gl) { pmc_init(); + //mark live objects pmc_mark(gl); + //count live objects per unit pmc_count(); tmc_spin_barrier_wait(&pmc_heapptr->barrier); + //divide up work if (BAMBOO_NUM_OF_THREADS==STARTUPCORE) { pmc_processunits(); } tmc_spin_barrier_wait(&pmc_heapptr->barrier); - + //set up forwarding pointers + pmc_doforward(); + tmc_spin_barrier_wait(&pmc_heapptr->barrier); + //update pointers + pmc_doreferenceupdate(); + tmc_spin_barrier_wait(&pmc_heapptr->barrier); + //compact data + pmc_docompact(); + tmc_spin_barrier_wait(&pmc_heapptr->barrier); } diff --git a/Robust/src/Runtime/bamboo/pmc_garbage.h b/Robust/src/Runtime/bamboo/pmc_garbage.h index d0a33a42..3158dcb0 100644 --- a/Robust/src/Runtime/bamboo/pmc_garbage.h +++ b/Robust/src/Runtime/bamboo/pmc_garbage.h @@ -13,6 +13,8 @@ struct pmc_unit { struct pmc_region { void * lastptr; + void * startptr; + void * endptr; struct ___Object___ * lastobj; struct pmc_queue markqueue; }; diff --git a/Robust/src/Runtime/bamboo/pmc_refupdate.c b/Robust/src/Runtime/bamboo/pmc_refupdate.c index 780d615d..1e4eaa87 100644 --- a/Robust/src/Runtime/bamboo/pmc_refupdate.c +++ b/Robust/src/Runtime/bamboo/pmc_refupdate.c @@ -28,6 +28,11 @@ void pmc_updatePtrs(void *ptr, int type) { } } +void pmc_doreferenceupdate() { + struct pmc_region * region=&pmc_heapptr->regions[BAMBOO_NUM_OF_CORE]; + pmc_referenceupdate(region->startptr, region->endptr); +} + void pmc_referenceupdate(void *bottomptr, void *topptr) { void *tmpptr=bottomptr; while(tmpptrregions[BAMBOO_NUM_OF_CORE]; + pmc_compact(region, BAMBOO_NUM_OF_CORE&1, region->startptr, region->endptr); +} + void pmc_compact(struct pmc_region * region, int forward, void *bottomptr, void *topptr) { if (forward) { -- 2.34.1