From: bdemsky Date: Tue, 20 Feb 2007 08:48:57 +0000 (+0000) Subject: adding thread support w/ locks X-Git-Tag: preEdgeChange~715 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=19b5f9458018000ffbbbb0c10310dc087e56c2da;p=IRC.git adding thread support w/ locks --- diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 20f0892c..1e5c9291 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -107,6 +107,9 @@ public class BuildCode { // Output the C class declarations // These could mutually reference each other + if (state.THREAD) + outclassdefs.println("#include "); + outclassdefs.println("struct "+arraytype+";"); Iterator it=state.getClassSymbolTable().getDescriptorsIterator(); @@ -119,9 +122,13 @@ public class BuildCode { //Print out definition for array type outclassdefs.println("struct "+arraytype+" {"); outclassdefs.println(" int type;"); - outclassdefs.println(" int flag;"); + if (state.THREAD) { + outclassdefs.println(" pthread_t tid;"); + outclassdefs.println(" int lockcount;"); + } if (state.TASK) { + outclassdefs.println(" int flag;"); outclassdefs.println(" void * flagptr;"); } printClassStruct(typeutil.getClass(TypeUtil.ObjectClass), outclassdefs); @@ -289,10 +296,8 @@ public class BuildCode { break; } if (state.THREAD) { - outmethod.println("pthread_mutex_lock(&threadtable);"); - outmethod.println("threadcount--;"); - outmethod.println("pthread_mutex_unlock(&threadtable);"); outmethod.println("pthread_mutex_lock(&gclistlock);"); + outmethod.println("threadcount--;"); outmethod.println("pthread_cond_signal(&gccond);"); outmethod.println("pthread_mutex_unlock(&gclistlock);"); outmethod.println("pthread_exit(NULL);"); @@ -722,9 +727,13 @@ public class BuildCode { /* Output class structure */ classdefout.println("struct "+cn.getSafeSymbol()+" {"); classdefout.println(" int type;"); - classdefout.println(" int flag;"); + if (state.THREAD) { + classdefout.println(" pthread_t tid;"); + classdefout.println(" int lockcount;"); + } if (state.TASK) { + classdefout.println(" int flag;"); classdefout.println(" void * flagptr;"); } printClassStruct(cn, classdefout); diff --git a/Robust/src/IR/Flat/BuildFlat.java b/Robust/src/IR/Flat/BuildFlat.java index 3ff20b0f..bce8e4ca 100644 --- a/Robust/src/IR/Flat/BuildFlat.java +++ b/Robust/src/IR/Flat/BuildFlat.java @@ -6,10 +6,13 @@ import java.util.*; public class BuildFlat { State state; Hashtable temptovar; + MethodDescriptor currmd; + TypeUtil typeutil; - public BuildFlat(State st) { + public BuildFlat(State st, TypeUtil typeutil) { state=st; temptovar=new Hashtable(); + this.typeutil=typeutil; } public Hashtable getMap() { @@ -67,16 +70,30 @@ public class BuildFlat { private void flattenClass(ClassDescriptor cn) { Iterator methodit=cn.getMethods(); while(methodit.hasNext()) { - MethodDescriptor md=(MethodDescriptor)methodit.next(); - BlockNode bn=state.getMethodBody(md); - FlatNode fn=flattenBlockNode(bn).getBegin(); - FlatMethod fm=new FlatMethod(md, fn); - if (!md.isStatic()) - fm.addParameterTemp(getTempforParam(md.getThis())); - for(int i=0;i___value___; int i; @@ -436,8 +428,12 @@ void CALL01(___System______printString____L___String___,struct ___String___ * __ #ifdef PRECISE_GC void * allocate_new(void * ptr, int type) { - void * v=mygcmalloc((struct garbagelist *) ptr, classsize[type]); - *((int *)v)=type; + struct ___Object___ * v=(struct ___Object___ *) mygcmalloc((struct garbagelist *) ptr, classsize[type]); + v->type=type; +#ifdef THREADS + v->tid=0; + v->lockcount=0; +#endif return v; } @@ -447,6 +443,10 @@ struct ArrayObject * allocate_newarray(void * ptr, int type, int length) { struct ArrayObject * v=mygcmalloc((struct garbagelist *) ptr, sizeof(struct ArrayObject)+length*classsize[type]); v->type=type; v->___length___=length; +#ifdef THREADS + v->tid=0; + v->lockcount=0; +#endif return v; } diff --git a/Robust/src/Runtime/thread.c b/Robust/src/Runtime/thread.c index 99e79cef..2f745651 100644 --- a/Robust/src/Runtime/thread.c +++ b/Robust/src/Runtime/thread.c @@ -7,18 +7,20 @@ #include -pthread_mutex_t threadtable; int threadcount; pthread_mutex_t gclock; pthread_mutex_t gclistlock; pthread_cond_t gccond; +pthread_mutex_t objlock; +pthread_cond_t objcond; void initializethreads() { - pthread_mutex_init(&threadtable,NULL); threadcount=1; pthread_mutex_init(&gclock, NULL); pthread_mutex_init(&gclistlock, NULL); pthread_cond_init(&gccond, NULL); + pthread_mutex_init(&objlock,NULL); + pthread_cond_init(&objcond,NULL); } void initthread(struct ___Thread___ * ___this___) { @@ -28,18 +30,16 @@ void initthread(struct ___Thread___ * ___this___) { #else ___Thread______staticStart____L___Thread___(___this___); #endif - pthread_mutex_lock(&threadtable); - threadcount--; - pthread_mutex_unlock(&threadtable); pthread_mutex_lock(&gclistlock); + threadcount--; pthread_cond_signal(&gccond); pthread_mutex_unlock(&gclistlock); } void CALL01(___Thread______nativeCreate____, struct ___Thread___ * ___this___) { pthread_t thread; - pthread_mutex_lock(&threadtable); + pthread_mutex_lock(&gclistlock); threadcount++; - pthread_mutex_unlock(&threadtable); + pthread_mutex_unlock(&gclistlock); pthread_create(&thread, NULL,(void * (*)(void *)) &initthread, VAR(___this___)); } diff --git a/Robust/src/Runtime/thread.h b/Robust/src/Runtime/thread.h index dc728cca..e12a8e06 100644 --- a/Robust/src/Runtime/thread.h +++ b/Robust/src/Runtime/thread.h @@ -3,10 +3,11 @@ #include "methodheaders.h" #include "pthread.h" -extern pthread_mutex_t threadtable; extern int threadcount; extern pthread_mutex_t gclock; extern pthread_mutex_t gclistlock; extern pthread_cond_t gccond; +extern pthread_mutex_t objlock; +extern pthread_cond_t objcond; void initthread(struct ___Thread___ * ___this___); #endif diff --git a/Robust/src/buildscript b/Robust/src/buildscript index 522b8690..0a7f880c 100755 --- a/Robust/src/buildscript +++ b/Robust/src/buildscript @@ -155,7 +155,8 @@ INCLUDES="$INCLUDES -I$ROBUSTROOT/Runtime -I. -IRuntime/include \ FILES="$ROBUSTROOT/Runtime/runtime.c $ROBUSTROOT/Runtime/file.c \ $ROBUSTROOT/Runtime/Queue.c $ROBUSTROOT/Runtime/SimpleHash.c \ $ROBUSTROOT/Runtime/option.c $ROBUSTROOT/Runtime/garbage.c \ -$ROBUSTROOT/Runtime/socket.c $ROBUSTROOT/Runtime/GenericHashtable.c" +$ROBUSTROOT/Runtime/socket.c $ROBUSTROOT/Runtime/GenericHashtable.c \ +$ROBUSTROOT/Runtime/object.c" if $RECOVERFLAG then