1 #include "multicoregc.h"
2 #include "pmc_garbage.h"
3 #include "runtime_arch.h"
5 struct pmc_heap * pmc_heapptr;
6 struct pmc_queue * pmc_localqueue;
8 void incrementthreads() {
9 tmc_spin_mutex_lock(&pmc_heapptr->lock);
10 pmc_heapptr->numthreads++;
11 tmc_spin_mutex_unlock(&pmc_heapptr->lock);
14 void decrementthreads() {
15 tmc_spin_mutex_lock(&pmc_heapptr->lock);
16 pmc_heapptr->numthreads--;
17 tmc_spin_mutex_unlock(&pmc_heapptr->lock);
20 void * pmc_unitend(unsigned int index) {
21 return gcbaseva+(index+1)*NUMPMCUNITS;
25 pmc_localqueue=&pmc_heapptr->regions[BAMBOO_NUM_OF_CORE].markqueue;
26 pmc_queueinit(pmc_localqueue);
27 tmc_spin_barrier_init(&pmc_heapptr->barrier, NUMCORES4GC);
28 for(int i=0;i<NUMPMCUNITS;i++) {
29 pmc_heapptr->units[i].endptr=pmc_unitend(i);
34 if (BAMBOO_NUM_OF_CORE==STARTUPCORE) {
35 pmc_heapptr->numthreads=NUMCORES4GC;
37 tmc_spin_barrier_wait(&pmc_heapptr->barrier);
40 void gc(struct garbagelist *gl) {
44 //count live objects per unit
46 tmc_spin_barrier_wait(&pmc_heapptr->barrier);
48 if (BAMBOO_NUM_OF_CORE==STARTUPCORE) {
51 tmc_spin_barrier_wait(&pmc_heapptr->barrier);
52 //set up forwarding pointers
54 tmc_spin_barrier_wait(&pmc_heapptr->barrier);
56 pmc_doreferenceupdate();
57 tmc_spin_barrier_wait(&pmc_heapptr->barrier);
60 tmc_spin_barrier_wait(&pmc_heapptr->barrier);