From: bdemsky Date: Tue, 5 Jul 2011 22:34:26 +0000 (+0000) Subject: more code towards second gc X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=41c2a7ff2225b4593cc67db804138878eb1c5aa1;p=IRC.git more code towards second gc --- diff --git a/Robust/src/Runtime/bamboo/pmc_forward.c b/Robust/src/Runtime/bamboo/pmc_forward.c index 007466f5..41f23645 100644 --- a/Robust/src/Runtime/bamboo/pmc_forward.c +++ b/Robust/src/Runtime/bamboo/pmc_forward.c @@ -1,8 +1,18 @@ #include "pmc_forward.h" +void pmc_count() { + for(int i=0;iunits[i].lock)) { + //got lock + void *unitbase=gcbaseva+i*UNITSIZE; + void *unittop=unitbase+UNITSIZE; + pmc_countbytes(&pmc_heapptr->unit[i], unitbase, unittop); + } + } +} //Comment: should build dummy byte arrays to allow skipping data... -void pmc_countbytes(struct pmc_region * region, void *bottomptr, void *topptr) { +void pmc_countbytes(struct pmc_unit * unit, void *bottomptr, void *topptr) { void *tmpptr=bottomptr; unsigned int totalbytes=0; while(tmpptrnumbytes=totalbytes; + unit->numbytes=totalbytes; +} + +void pmc_processunits() { + unsigned int livebytes=0; + for(int i=0;iunits[i].numbytes; + } + //make sure to round up + unsigned int livebytespercore=((livebytes-1)/NUMCORES4GC)+1; + unsigned int regionnum=0; + int totalbytes=0; + int numregions=0; + + for(int i=0;i0&&(totalbytes+pmc_heapptr->units[i].numbytes)>livebytespercore) { + regionnum++; + totalbytes-=livebytespercore; + numregions=0; + } + numregions++; + pmc_heapptr->units[i].regionnum=regionnum; + tmc_spin_mutex_init(&pmc_heapptr->units[i].lock); + totalbytes+=pmc_heapptr->units[i].numbytes; + } } diff --git a/Robust/src/Runtime/bamboo/pmc_garbage.c b/Robust/src/Runtime/bamboo/pmc_garbage.c index e0027e57..6e13da82 100644 --- a/Robust/src/Runtime/bamboo/pmc_garbage.c +++ b/Robust/src/Runtime/bamboo/pmc_garbage.c @@ -1,5 +1,7 @@ #include "pmc_garbage.h" +struct pmc_queue * pmc_localqueue; + void incrementthreads() { tmc_spin_mutex_lock(&pmc_heapptr->lock); pmc_heapptr->numthreads++; @@ -11,3 +13,28 @@ void decrementthreads() { pmc_heapptr->numthreads--; tmc_spin_mutex_unlock(&pmc_heapptr->lock); } + +void pmc_onceInit() { + pmc_localqueue=&pmc_heapptr->regions[BAMBOO_NUM_OF_THREADS].markqueue; + pmc_queueinit(pmc_localqueue); + tmc_spin_barrier_init(&pmc_heapptr->barrier, NUMCORES4GC); +} + +void pmc_init() { + if (BAMBOO_NUM_OF_THREADS==STARTUPCORE) { + pmc_heapptr->numthreads=NUMCORES4GC; + } + tmc_spin_barrier_wait(&pmc_heapptr->barrier); +} + +void gc(struct garbagelist *gl) { + pmc_init(); + pmc_mark(gl); + pmc_count(); + tmc_spin_barrier_wait(&pmc_heapptr->barrier); + if (BAMBOO_NUM_OF_THREADS==STARTUPCORE) { + pmc_processunits(); + } + 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 4bf76737..d0a33a42 100644 --- a/Robust/src/Runtime/bamboo/pmc_garbage.h +++ b/Robust/src/Runtime/bamboo/pmc_garbage.h @@ -2,9 +2,13 @@ #define PMC_GARBAGE_H #include +#define NUMPMCUNITS (4*NUMCORES4GC) +#define UNITSIZE (BAMBOO_SHARED_MEM_SIZE/NUMPMCUNITS) + struct pmc_unit { tmc_spin_mutex_t lock; unsigned int numbytes; + unsigned int regionnum; }; struct pmc_region { @@ -14,16 +18,19 @@ struct pmc_region { }; struct pmc_heap { - struct pmc_region units[NUMCORES4GC*4]; + struct pmc_region units[NUMPMCUNITS]; struct pmc_region regions[NUMCORES4GC]; tmc_spin_mutex_t lock; volatile unsigned int numthreads; }; extern struct pmc_heap * pmc_heapptr; +extern struct pmc_queue * pmc_localqueue; void incrementthreads(); -void decrementthreads() { +void decrementthreads(); +void pmc_onceInit(); +void pmc_init(); #endif diff --git a/Robust/src/Runtime/bamboo/pmc_queue.c b/Robust/src/Runtime/bamboo/pmc_queue.c index 55dff871..82fbcc1d 100644 --- a/Robust/src/Runtime/bamboo/pmc_queue.c +++ b/Robust/src/Runtime/bamboo/pmc_queue.c @@ -1,6 +1,6 @@ #include "pmc_queue.h" -void pmc_init(struct pmc_queue *queue) { +void pmc_queueinit(struct pmc_queue *queue) { queue->head=queue->tail=RUNMALLOC(struct pmc_queue_segment); queue->headindex=queue->tailindex=0; } diff --git a/Robust/src/Runtime/bamboo/pmc_queue.h b/Robust/src/Runtime/bamboo/pmc_queue.h index 69d047a6..692019a7 100644 --- a/Robust/src/Runtime/bamboo/pmc_queue.h +++ b/Robust/src/Runtime/bamboo/pmc_queue.h @@ -14,10 +14,11 @@ struct pmc_queue { volatile int headindex; volatile int tailindex; tmc_spin_mutex_t lock; + tmc_spin_barrier_t barrier; }; void * pmc_dequeue(struct pmc_queue *queue); void pmc_enqueue(struct pmc_queue* queue, void *ptr); bool pmc_isEmpty(struct pmc_queue *queue); -void pmc_init(struct pmc_queue *queue); +void pmc_queueinit(struct pmc_queue *queue); #endif