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