bug fixes for evil garbage collection bugs...
authorbdemsky <bdemsky>
Fri, 29 Feb 2008 20:33:30 +0000 (20:33 +0000)
committerbdemsky <bdemsky>
Fri, 29 Feb 2008 20:33:30 +0000 (20:33 +0000)
Robust/src/Benchmarks/Prefetch/MatrixMultiply/MatrixMultiply.java
Robust/src/IR/Flat/BuildCode.java
Robust/src/Runtime/DSTM/interface/dstmserver.c
Robust/src/Runtime/DSTM/interface/localobjects.c
Robust/src/Runtime/DSTM/interface/localobjects.h
Robust/src/Runtime/garbage.c

index 8238605c3e9038ded52e6f915b68a50b18cd001b..8c7182534ce7de3450d6b1cb2958959d9d3832f2 100644 (file)
@@ -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;
index 5518e0a06fd6355c5d4e6c9007350ed3600bdd04..6dd69a0ab058d5587171ff1b27aeaf39fd3c8707 100644 (file)
@@ -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()+");");
            }
index 99f48f070727b627bf42f88a2230f3122d89e79d..379ea28731e9f60484b597aa7348a606aae6225f 100644 (file)
@@ -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;
index f1c465359397d92f082b170cd2ecc60214739b85..0fdf0fd127c5455c3ccff40252cb3725c2c663bc 100644 (file)
@@ -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;
   }
 }
index 9d4968dda3819a1bbd397f7080866b9a65a098ca..6b69ee8793410efd74b27af05232588e605b9805 100644 (file)
@@ -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);
index 283e60b84470b4fe050c56da560dbcf46f3e368c..b1dc3a0ede97c11042bd80f9525d3e92bf38d7bf 100644 (file)
@@ -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;i<length;i++) {
@@ -387,7 +399,6 @@ void * tomalloc(int size) {
 }
 
 #if defined(THREADS)||defined(DSTM)
-
 void checkcollect(void * ptr) {
   if (needtocollect) {
     struct listitem * tmp=stopforgc((struct garbagelist *)ptr);
@@ -398,6 +409,20 @@ void checkcollect(void * ptr) {
   }
 }
 
+#ifdef DSTM
+void checkcollect2(void * ptr, transrecord_t *trans) {
+  if (needtocollect) {
+    int ptrarray[]={1, (int)ptr, (int) trans->revertlist};
+    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;