From: jjenista Date: Tue, 18 Aug 2009 18:28:08 +0000 (+0000) Subject: a better workscheduler--still has a deficiency because it does not dynamically create... X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=296a232a015befc68bef08897bd7d3e45f1aca4f;hp=edae4bedef87b02fa16acc12b68fc4727d90a6a4;p=IRC.git a better workscheduler--still has a deficiency because it does not dynamically create more worker threads as threads stall on one another, so some programs could exhaust the pool and all threads will hang --- diff --git a/Robust/src/Analysis/MLP/MLPAnalysis.java b/Robust/src/Analysis/MLP/MLPAnalysis.java index 49fca039..4fa42601 100644 --- a/Robust/src/Analysis/MLP/MLPAnalysis.java +++ b/Robust/src/Analysis/MLP/MLPAnalysis.java @@ -143,7 +143,7 @@ public class MLPAnalysis { pruneVariableResultsWithLiveness( fm ); } if( state.MLPDEBUG ) { - System.out.println( "\nVariable Results-Out\n----------------\n"+fmMain.printMethod( variableResults ) ); + //System.out.println( "\nVariable Results-Out\n----------------\n"+fmMain.printMethod( variableResults ) ); } diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 789d90e4..240e6c5f 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -2022,6 +2022,12 @@ public class BuildCode { outmethod.println( " /* "+fsen.getPrettyIdentifier()+" */"); outmethod.println( " case "+fsen.getIdentifier()+":"); outmethod.println( " "+fsen.getSESEmethodName()+"( seseRecord );"); + + if( fsen.equals( mlpa.getRootSESE() ) ) { + outmethod.println( " /* work scheduler works forever, explicitly exit */"); + outmethod.println( " exit( 0 );"); + } + outmethod.println( " break;"); outmethod.println( ""); } diff --git a/Robust/src/Runtime/workschedule.c b/Robust/src/Runtime/workschedule.c index 65928071..5b24b68d 100644 --- a/Robust/src/Runtime/workschedule.c +++ b/Robust/src/Runtime/workschedule.c @@ -28,8 +28,12 @@ typedef struct workerData_t { int nextWorkerToLoad; } workerData; */ + + +static pthread_mutex_t systemLock; + // just one queue for everyone -static pthread_mutex_t dequeLock; +//static pthread_mutex_t dequeLock; static deq* dequeWorkUnits; @@ -38,12 +42,18 @@ static deq* dequeWorkUnits; static int numWorkers; //static workerData* workerDataArray; static pthread_t* workerArray; -static pthread_mutex_t systemBeginLock = PTHREAD_MUTEX_INITIALIZER; + +static int systemStarted = 0; + +//static pthread_mutex_t systemBeginLock = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t systemBeginCond = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t systemReturnLock = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t systemReturnCond = PTHREAD_COND_INITIALIZER; +//static pthread_mutex_t systemReturnLock = PTHREAD_MUTEX_INITIALIZER; +//static pthread_cond_t systemReturnCond = PTHREAD_COND_INITIALIZER; static void(*workFunc)(void*); +static pthread_cond_t workAvailCond = PTHREAD_COND_INITIALIZER; + + /* // helper func @@ -144,35 +154,29 @@ void* workerMain( void* arg ) { void* workUnit; - int tries = 3; - // all workers wait until system is ready - pthread_mutex_lock ( &systemBeginLock ); - pthread_cond_wait ( &systemBeginCond, &systemBeginLock ); - pthread_mutex_unlock( &systemBeginLock ); - - while( tries > 0 ) { - - pthread_mutex_lock( &dequeLock ); + pthread_mutex_lock ( &systemLock ); + while( !systemStarted ) { + pthread_cond_wait( &systemBeginCond, &systemLock ); + } + pthread_mutex_unlock( &systemLock ); - // look in the queue for work - if( !isEmpty( dequeWorkUnits ) ) { - workUnit = getItem( dequeWorkUnits ); - } else { - workUnit = NULL; - } + while( 1 ) { - pthread_mutex_unlock( &dequeLock ); + pthread_mutex_lock( &systemLock ); + // wait for work + while( isEmpty( dequeWorkUnits ) ) { + pthread_cond_wait( &workAvailCond, &systemLock ); + } + workUnit = getItem( dequeWorkUnits ); + pthread_mutex_unlock( &systemLock ); - // yield processor before moving on + // yield processor before moving on, just to exercise + // system's out-of-order correctness if( sched_yield() == -1 ) { printf( "Error thread trying to yield.\n" ); exit( -1 ); } - - if( workUnit != NULL ) { - workFunc( workUnit ); - tries = 3; - } else { - --tries; - } + if( sched_yield() == -1 ) { printf( "Error thread trying to yield.\n" ); exit( -1 ); } + + workFunc( workUnit ); } return NULL; @@ -236,7 +240,7 @@ void workScheduleInit( int numProcessors, dequeWorkUnits = createQueue(); - status = pthread_mutex_init( &dequeLock, NULL ); + status = pthread_mutex_init( &systemLock, NULL ); if( status != 0 ) { printf( "Error\n" ); exit( -1 ); } workerArray = RUNMALLOC( sizeof( pthread_t ) * numWorkers ); @@ -275,9 +279,10 @@ void workScheduleSubmit( void* workUnit ) { */ void workScheduleSubmit( void* workUnit ) { - pthread_mutex_lock ( &dequeLock ); + pthread_mutex_lock ( &systemLock ); addNewItemBack ( dequeWorkUnits, workUnit ); - pthread_mutex_unlock( &dequeLock ); + pthread_cond_signal( &workAvailCond ); + pthread_mutex_unlock( &systemLock ); } @@ -287,9 +292,10 @@ void workScheduleBegin() { int i; // tell all workers to begin - pthread_mutex_lock ( &systemBeginLock ); + pthread_mutex_lock ( &systemLock ); + systemStarted = 1; pthread_cond_broadcast( &systemBeginCond ); - pthread_mutex_unlock ( &systemBeginLock ); + pthread_mutex_unlock ( &systemLock ); for( i = 0; i < numWorkers; ++i ) { pthread_join( workerArray[i], NULL ); diff --git a/Robust/src/Tests/mlp/tinyTest/debugging.txt b/Robust/src/Tests/mlp/tinyTest/debugging.txt index 96c48048..756f2bc1 100644 --- a/Robust/src/Tests/mlp/tinyTest/debugging.txt +++ b/Robust/src/Tests/mlp/tinyTest/debugging.txt @@ -1,2 +1,11 @@ -break methods.c:6664 -run +break methods.c:6605 +break methods.c:6606 +break methods.c:6644 +break methods.c:6657 +break methods.c:6755 +break methods.c:6782 +break methods.c:6789 +break methods.c:6793 +break methods.c:6805 +break methods.c:6808 +run 2 diff --git a/Robust/src/Tests/mlp/tinyTest/test.java b/Robust/src/Tests/mlp/tinyTest/test.java index c7637214..1969cb84 100644 --- a/Robust/src/Tests/mlp/tinyTest/test.java +++ b/Robust/src/Tests/mlp/tinyTest/test.java @@ -8,7 +8,7 @@ public class Test { public static void main( String args[] ) { - //int x = Integer.parseInt( args[0] ); + int x = Integer.parseInt( args[0] ); //int y = Integer.parseInt( args[1] ); //System.out.println( "root: x="+x+", y="+y ); @@ -28,13 +28,15 @@ public class Test { int total = 0; - for( int i = 0; i < 5; ++i ) { + for( int i = 0; i < x; ++i ) { System.out.println( "i="+i ); sese sum { total = total + i; } + + System.out.println( "pi="+i ); }