From: bdemsky Date: Fri, 29 Feb 2008 20:33:30 +0000 (+0000) Subject: bug fixes for evil garbage collection bugs... X-Git-Tag: preEdgeChange~248 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=518d5794c928546e0499854659aacf7b55dff5f1;p=IRC.git bug fixes for evil garbage collection bugs... --- diff --git a/Robust/src/Benchmarks/Prefetch/MatrixMultiply/MatrixMultiply.java b/Robust/src/Benchmarks/Prefetch/MatrixMultiply/MatrixMultiply.java index 8238605c..8c718253 100644 --- a/Robust/src/Benchmarks/Prefetch/MatrixMultiply/MatrixMultiply.java +++ b/Robust/src/Benchmarks/Prefetch/MatrixMultiply/MatrixMultiply.java @@ -42,7 +42,7 @@ public class MatrixMultiply extends Thread{ } public static void main(String[] args) { - int mid1 = (128<<24)|(195<<16)|(175<<8)|70; + int mid1 = (172<<24)|(16<<16)|(9<<8)|129; int mid2 = (128<<24)|(195<<16)|(175<<8)|69; int mid3 = (128<<24)|(195<<16)|(175<<8)|71; int NUM_THREADS = 2; diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 5518e0a0..6dd69a0a 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -811,7 +811,7 @@ public class BuildCode { objecttemps.addPrim(tmp); } /* Create temp to hold revert table */ - if (lb.getHasAtomic()) { + if (lb.getHasAtomic()||lb.isAtomic()) { TempDescriptor reverttmp=new TempDescriptor("revertlist", typeutil.getClass(TypeUtil.ObjectClass)); if (GENERATEPRECISEGC) objecttemps.addPtr(reverttmp); @@ -1247,7 +1247,10 @@ public class BuildCode { * multi-threaded program...*/ if ((state.THREAD||state.DSM)&&GENERATEPRECISEGC) { - output.println("checkcollect(&"+localsprefix+");"); + if (state.DSM&&lb.isAtomic()) + output.println("checkcollect2(&"+localsprefix+",trans);"); + else + output.println("checkcollect(&"+localsprefix+");"); } /* Do the actual code generation */ @@ -1405,7 +1408,10 @@ public class BuildCode { return; case FKind.FlatBackEdge: if ((state.THREAD||state.DSM)&&GENERATEPRECISEGC) { - output.println("checkcollect(&"+localsprefix+");"); + if(state.DSM&&locality.getAtomic(lb).get(fn).intValue()>0) { + output.println("checkcollect2(&"+localsprefix+",trans);"); + } else + output.println("checkcollect(&"+localsprefix+");"); } else output.println("/* nop */"); return; @@ -2042,12 +2048,14 @@ public class BuildCode { /** Check if we need to copy */ output.println("if(!"+dst+"->"+localcopystr+") {"); /* Link object into list */ - output.println(dst+"->"+nextobjstr+"=trans->revertlist;"); - output.println("trans->revertlist=(struct ___Object___ *)"+dst+";"); + String revertptr=generateTemp(fm, reverttable.get(lb),lb); + output.println(revertptr+"=trans->revertlist;"); if (GENERATEPRECISEGC) output.println("COPY_OBJ((struct garbagelist *)&"+localsprefix+",(struct ___Object___ *)"+dst+");"); else output.println("COPY_OBJ("+dst+");"); + output.println(dst+"->"+nextobjstr+"="+revertptr+";"); + output.println("trans->revertlist=(struct ___Object___ *)"+dst+";"); output.println("}"); if (srcglobal) output.println(dst+"->"+ fsfn.getField().getSafeSymbol()+"=srcoid;"); @@ -2132,9 +2140,26 @@ public class BuildCode { Integer statusdst=locality.getNodePreTempInfo(lb,fsen).get(fsen.getDst()); boolean srcglobal=statussrc==LocalityAnalysis.GLOBAL; boolean dstglobal=statusdst==LocalityAnalysis.GLOBAL; + boolean dstlocal=statusdst==LocalityAnalysis.LOCAL; + if (dstglobal) { output.println("*((unsigned int *)&("+generateTemp(fm,fsen.getDst(),lb)+"->___localcopy___))|=DIRTY;"); - } + } else if (dstlocal) { + /** Check if we need to copy */ + String dst=generateTemp(fm, fsen.getDst(),lb); + output.println("if(!"+dst+"->"+localcopystr+") {"); + /* Link object into list */ + String revertptr=generateTemp(fm, reverttable.get(lb),lb); + output.println(revertptr+"=trans->revertlist;"); + if (GENERATEPRECISEGC) + output.println("COPY_OBJ((struct garbagelist *)&"+localsprefix+",(struct ___Object___ *)"+dst+");"); + else + output.println("COPY_OBJ("+dst+");"); + output.println(dst+"->"+nextobjstr+"="+revertptr+";"); + + output.println("trans->revertlist=(struct ___Object___ *)"+dst+";"); + output.println("}"); + } else throw new Error("Unknown array type"); if (srcglobal) { output.println("{"); String src=generateTemp(fm, fsen.getSrc(), lb); @@ -2149,6 +2174,11 @@ public class BuildCode { } private void generateFlatNew(FlatMethod fm, LocalityBinding lb, FlatNew fn, PrintWriter output) { + if (state.DSM && locality.getAtomic(lb).get(fn).intValue()>0&&!fn.isGlobal()) { + //Stash pointer in case of GC + String revertptr=generateTemp(fm, reverttable.get(lb),lb); + output.println(revertptr+"=trans->revertlist;"); + } if (fn.getType().isArray()) { int arrayid=state.getArrayNumber(fn.getType())+state.numClasses(); if (fn.isGlobal()) { @@ -2167,6 +2197,10 @@ public class BuildCode { output.println(generateTemp(fm,fn.getDst(),lb)+"=allocate_new("+fn.getType().getClassDesc().getId()+");"); } } + if (state.DSM && locality.getAtomic(lb).get(fn).intValue()>0&&!fn.isGlobal()) { + String revertptr=generateTemp(fm, reverttable.get(lb),lb); + output.println("trans->revertlist="+revertptr+";"); + } } private void generateFlatTagDeclaration(FlatMethod fm, LocalityBinding lb, FlatTagDeclaration fn, PrintWriter output) { @@ -2218,7 +2252,17 @@ public class BuildCode { output.println(generateTemp(fm, fln.getDst(),lb)+"=0;"); else if (fln.getType().getSymbol().equals(TypeUtil.StringClass)) { if (GENERATEPRECISEGC) { + if (state.DSM && locality.getAtomic(lb).get(fln).intValue()>0) { + //Stash pointer in case of GC + String revertptr=generateTemp(fm, reverttable.get(lb),lb); + output.println(revertptr+"=trans->revertlist;"); + } output.println(generateTemp(fm, fln.getDst(),lb)+"=NewString(&"+localsprefix+", \""+FlatLiteralNode.escapeString((String)fln.getValue())+"\","+((String)fln.getValue()).length()+");"); + if (state.DSM && locality.getAtomic(lb).get(fln).intValue()>0) { + //Stash pointer in case of GC + String revertptr=generateTemp(fm, reverttable.get(lb),lb); + output.println("trans->revertlist="+revertptr+";"); + } } else { output.println(generateTemp(fm, fln.getDst(),lb)+"=NewString(\""+FlatLiteralNode.escapeString((String)fln.getValue())+"\","+((String)fln.getValue()).length()+");"); } diff --git a/Robust/src/Runtime/DSTM/interface/dstmserver.c b/Robust/src/Runtime/DSTM/interface/dstmserver.c index 99f48f07..379ea287 100644 --- a/Robust/src/Runtime/DSTM/interface/dstmserver.c +++ b/Robust/src/Runtime/DSTM/interface/dstmserver.c @@ -500,7 +500,7 @@ char handleTransReq(fixed_data_t *fixed, trans_commit_data_t *transinfo, unsigne /* Send TRANS_DISAGREE to Coordinator */ control = TRANS_DISAGREE; if (objlocked > 0) { - for(j = 0; j < objlocked; j++) { + for(j = 0; j < objlocked; j++) { if((headptr = mhashSearch(oidlocked[j])) == NULL) { printf("mhashSearch returns NULL at %s, %d\n", __FILE__, __LINE__); return 0; diff --git a/Robust/src/Runtime/DSTM/interface/localobjects.c b/Robust/src/Runtime/DSTM/interface/localobjects.c index f1c46535..0fdf0fd1 100644 --- a/Robust/src/Runtime/DSTM/interface/localobjects.c +++ b/Robust/src/Runtime/DSTM/interface/localobjects.c @@ -33,8 +33,8 @@ void COPY_OBJ(struct ___Object___ *obj) { #else struct ___Object___ * newobj=FREEMALLOC(size); #endif - memcpy(newobj, (struct ___Object___ *) ptrarray[1], size); - ((struct ___Object___*)ptrarray[1])->___localcopy___=newobj; + memcpy(newobj, (struct ___Object___ *) ptrarray[2], size); + ((struct ___Object___*)ptrarray[2])->___localcopy___=newobj; } else { /* We have an array */ struct ArrayObject *ao=(struct ArrayObject *)obj; @@ -47,7 +47,7 @@ void COPY_OBJ(struct ___Object___ *obj) { #else struct ___Object___ * newobj=FREEMALLOC(size); #endif - memcpy(newobj, (struct ___Object___ *) ptrarray[1], size); - ((struct ___Object___*)ptrarray[1])->___localcopy___=newobj; + memcpy(newobj, (struct ___Object___ *) ptrarray[2], size); + ((struct ___Object___*)ptrarray[2])->___localcopy___=newobj; } } diff --git a/Robust/src/Runtime/DSTM/interface/localobjects.h b/Robust/src/Runtime/DSTM/interface/localobjects.h index 9d4968dd..6b69ee87 100644 --- a/Robust/src/Runtime/DSTM/interface/localobjects.h +++ b/Robust/src/Runtime/DSTM/interface/localobjects.h @@ -3,7 +3,8 @@ #include "structdefs.h" #include "garbage.h" void REVERT_OBJ(struct ___Object___ *); -#define COMMIT_OBJ(obj) obj->___localcopy___=NULL +#define COMMIT_OBJ(obj) obj->___localcopy___=NULL;\ + obj->___nextobject___=NULL #ifdef PRECISE_GC void COPY_OBJ(struct garbagelist * gl, struct ___Object___ *obj); diff --git a/Robust/src/Runtime/garbage.c b/Robust/src/Runtime/garbage.c index 283e60b8..b1dc3a0e 100644 --- a/Robust/src/Runtime/garbage.c +++ b/Robust/src/Runtime/garbage.c @@ -12,7 +12,9 @@ #ifdef DMALLOC #include "dmalloc.h" #endif - +#ifdef DSTM +#include "dstm.h" +#endif #define NUMPTRS 100 @@ -287,10 +289,20 @@ void collect(struct garbagelist * stackptr) { if (pointer==0) { /* Array of primitives */ /* Do nothing */ +#ifdef DSTM + struct ArrayObject *ao=(struct ArrayObject *) ptr; + struct ArrayObject *ao_cpy=(struct ArrayObject *) cpy; + ENQUEUE((void *)ao->___nextobject___, *((void **)&ao_cpy->___nextobject___)); + ENQUEUE((void *)ao->___localcopy___, *((void **)&ao_cpy->___localcopy___)); +#endif } else if (((int)pointer)==1) { /* Array of pointers */ struct ArrayObject *ao=(struct ArrayObject *) ptr; struct ArrayObject *ao_cpy=(struct ArrayObject *) cpy; +#ifdef DSTM + ENQUEUE((void *)ao->___nextobject___, *((void **)&ao_cpy->___nextobject___)); + ENQUEUE((void *)ao->___localcopy___, *((void **)&ao_cpy->___localcopy___)); +#endif int length=ao->___length___; int i; for(i=0;irevertlist}; + struct listitem * tmp=stopforgc((struct garbagelist *)ptrarray); + pthread_mutex_lock(&gclock); // Wait for GC + restartaftergc(tmp); + pthread_mutex_unlock(&gclock); + trans->revertlist=(struct ___Object___*)ptrarray[2]; + } +} +#endif + + struct listitem * stopforgc(struct garbagelist * ptr) { struct listitem * litem=malloc(sizeof(struct listitem)); litem->stackptr=ptr;