code towards PMC compiling
[IRC.git] / Robust / src / Runtime / bamboo / pmc_garbage.c
1 #include "multicoregc.h"
2 #include "pmc_garbage.h"
3 #include "runtime_arch.h"
4
5 struct pmc_heap * pmc_heapptr;
6 struct pmc_queue * pmc_localqueue;
7
8 void incrementthreads() {
9   tmc_spin_mutex_lock(&pmc_heapptr->lock);
10   pmc_heapptr->numthreads++;
11   tmc_spin_mutex_unlock(&pmc_heapptr->lock);
12 }
13
14 void decrementthreads() {
15   tmc_spin_mutex_lock(&pmc_heapptr->lock);
16   pmc_heapptr->numthreads--;
17   tmc_spin_mutex_unlock(&pmc_heapptr->lock);
18 }
19
20 void * pmc_unitend(unsigned int index) {
21   return gcbaseva+(index+1)*NUMPMCUNITS;
22 }
23
24 void pmc_onceInit() {
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);
30   }
31 }
32
33 void pmc_init() {
34   if (BAMBOO_NUM_OF_CORE==STARTUPCORE) {
35     pmc_heapptr->numthreads=NUMCORES4GC;
36   }
37   tmc_spin_barrier_wait(&pmc_heapptr->barrier);
38 }
39
40 void gc(struct garbagelist *gl) {
41   pmc_init();
42   //mark live objects
43   pmc_mark(gl);
44   //count live objects per unit
45   pmc_count();
46   tmc_spin_barrier_wait(&pmc_heapptr->barrier);
47   //divide up work
48   if (BAMBOO_NUM_OF_CORE==STARTUPCORE) {
49     pmc_processunits();
50   }
51   tmc_spin_barrier_wait(&pmc_heapptr->barrier);
52   //set up forwarding pointers
53   pmc_doforward();
54   tmc_spin_barrier_wait(&pmc_heapptr->barrier);
55   //update pointers
56   pmc_doreferenceupdate();
57   tmc_spin_barrier_wait(&pmc_heapptr->barrier);
58   //compact data
59   pmc_docompact();
60   tmc_spin_barrier_wait(&pmc_heapptr->barrier);
61 }