1 #include "pmc_forward.h"
4 for(int i=0;i<NUMPMCUNITS;i++) {
5 if (!tmc_spin_mutex_trylock(&pmc_heapptr->units[i].lock)) {
7 void *unitbase=(i==0)?gcbaseva:pmc_heapptr->unit[i-1]->endptr;
8 void *unittop=pmc_heapptr->unit[i]->endptr;
9 pmc_countbytes(&pmc_heapptr->unit[i], unitbase, unittop);
14 //Comment: should build dummy byte arrays to allow skipping data...
15 void pmc_countbytes(struct pmc_unit * unit, void *bottomptr, void *topptr) {
16 void *tmpptr=bottomptr;
17 unsigned int totalbytes=0;
18 while(tmpptr<topptr) {
21 gettype_size(tmpptr, &type, &size);
23 tmpptr+=ALIGNMENTSIZE;
26 size=((size-1)&(~(ALIGNMENTSIZE-1)))+ALIGNMENTSIZE;
27 if (((struct ___Object___ *)tmpptr)->marked)
31 unit->numbytes=totalbytes;
34 void pmc_processunits() {
35 unsigned int livebytes=0;
36 for(int i=0;i<NUMPMCUNITS;i++) {
37 livebytes+=pmc_heapptr->units[i].numbytes;
39 //make sure to round up
40 unsigned int livebytespercore=((livebytes-1)/NUMCORES4GC)+1;
41 unsigned int regionnum=0;
45 for(int i=0;i<NUMPMCUNITS;i++) {
46 if (numregions>0&&(totalbytes+pmc_heapptr->units[i].numbytes)>livebytespercore) {
48 totalbytes-=livebytespercore;
52 pmc_heapptr->units[i].regionnum=regionnum;
53 tmc_spin_mutex_init(&pmc_heapptr->units[i].lock);
54 totalbytes+=pmc_heapptr->units[i].numbytes;
58 void pmc_doforward() {
61 unsigned int totalbytes=0;
62 struct pmc_region * region=&pmc_heapptr->regions[BAMBOO_NUM_OF_CORE];
63 for(int i=0;i<NUMPMCUNITS;i++) {
64 if (startregion==-1&&BAMBOO_NUM_OF_CORE==pmc_heapptr->units[i].regionnum) {
67 if (BAMBOO_NUM_OF_CORE<pmc_heapptr->units[i].regionnum) {
71 if (startregion!=-1) {
72 totalbytes+=pmc_heapptr->units[i].numbytes;
78 endregion=NUMPMCUNITS;
79 region->lowunit=startregion;
80 region->highunit=endregion;
81 region->startptr=(startregion==0)?gcbaseva:pmc_heapptr->units[startregion-1].endptr;
82 region->endptr=pmc_heapptr->units[endregion].endptr;
84 if (BAMBOO_NUM_OF_CORE&1) {
86 region->lastptr=region->endptr-totalbytes;
89 region->lastptr=region->startptr+totalbytes;
92 pmc_forward(region, totalbytes, region->startptr, region->endptr, !(BAMBOO_NUM_OF_CORE&1));
96 void pmc_forward(struct pmc_region *region, unsigned int totalbytes, void *bottomptr, void *topptr, bool fwddirection) {
97 void *tmpptr=bottomptr;
98 void *forwardptr=fwddirection?bottomptr:(topptr-totalbytes);
99 struct ___Object___ *lastobj=NULL;
100 unsigned int currunit=region->lowunit;
101 void *endunit=pmc_unitend(currunit);
104 //reset boundaries of beginning units
105 while(endunit<forwardptr) {
106 pmc_heapptr->units[currunit].endptr=endunit;
108 endunit=pmc_unitend(currunit);
111 //reset boundaries of end units
112 unsigned int lastunit=region->highunit-1;
113 void * lastunitend=pmc_unitend(lastunit);
114 while(lastunitend>forwardptr) {
115 pmc_heapptr->units[currunit].endptr=lastunitend;
117 lastunitend=pmc_unitend(lastunit);
121 while(tmpptr>topptr) {
124 gettype_size(tmpptr, &type, &size);
126 tmpptr+=ALIGNMENTSIZE;
129 size=((size-1)&(~(ALIGNMENTSIZE-1)))+ALIGNMENTSIZE;
131 if (((struct ___Object___ *)tmpptr)->marked) {
132 ((struct ___Object___ *)tmpptr)->marked=forwardptr;
133 void *newforwardptr=forwardptr+size;
134 while(newforwardptr>endunit) {
135 pmc_heapptr->region[currunit].endptr=newforwardptr;
137 endunit=pmc_unitend(currunit);
140 forwardptr=newforwardptr;
141 if (lastobj&&!fwddirection) {
142 tmpptr->backward=lastobj;
143 lastobj=(struct ___Object___ *)tmpptr;
148 region->lastobj=lastobj;