1 #include "pmc_garbage.h"
3 struct pmc_queue * pmc_localqueue;
5 void incrementthreads() {
6 tmc_spin_mutex_lock(&pmc_heapptr->lock);
7 pmc_heapptr->numthreads++;
8 tmc_spin_mutex_unlock(&pmc_heapptr->lock);
11 void decrementthreads() {
12 tmc_spin_mutex_lock(&pmc_heapptr->lock);
13 pmc_heapptr->numthreads--;
14 tmc_spin_mutex_unlock(&pmc_heapptr->lock);
17 void * pmc_unitend(unsigned int index) {
18 return gcbaseva+(index+1)*NUMPMCUNITS;
22 pmc_localqueue=&pmc_heapptr->regions[BAMBOO_NUM_OF_THREADS].markqueue;
23 pmc_queueinit(pmc_localqueue);
24 tmc_spin_barrier_init(&pmc_heapptr->barrier, NUMCORES4GC);
25 for(int i=0;i<NUMPMCUNITS;i++) {
26 pmc_heapptr->units[i].endptr=pmc_unitend(i);
31 if (BAMBOO_NUM_OF_THREADS==STARTUPCORE) {
32 pmc_heapptr->numthreads=NUMCORES4GC;
34 tmc_spin_barrier_wait(&pmc_heapptr->barrier);
37 void gc(struct garbagelist *gl) {
41 //count live objects per unit
43 tmc_spin_barrier_wait(&pmc_heapptr->barrier);
45 if (BAMBOO_NUM_OF_THREADS==STARTUPCORE) {
48 tmc_spin_barrier_wait(&pmc_heapptr->barrier);
49 //set up forwarding pointers
51 tmc_spin_barrier_wait(&pmc_heapptr->barrier);
53 pmc_doreferenceupdate();
54 tmc_spin_barrier_wait(&pmc_heapptr->barrier);
57 tmc_spin_barrier_wait(&pmc_heapptr->barrier);