add a phtread implementation of semaphores for general runtime use
authorjjenista <jjenista>
Wed, 17 Jun 2009 18:32:07 +0000 (18:32 +0000)
committerjjenista <jjenista>
Wed, 17 Jun 2009 18:32:07 +0000 (18:32 +0000)
Robust/src/Runtime/mlp_runtime.c
Robust/src/Runtime/mlp_runtime.h
Robust/src/Runtime/psemaphore.c [new file with mode: 0644]
Robust/src/Runtime/psemaphore.h [new file with mode: 0644]
Robust/src/Tests/mlp/tinyTest/test.java

index 285cf6b62bcbcb907642cd023f1e005adedeaf86..a737d12aaceba810708a524adc55cc5f3669486b 100644 (file)
@@ -1,6 +1,9 @@
+#include "runtime.h"
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <assert.h>
+
 #include "mlp_runtime.h"
 #include "Queue.h"
 
index ced7623003cdf683c56b992b8566c900374a68de..990500ac02c61713bf7ea6f869b6054271c68786 100644 (file)
@@ -12,8 +12,6 @@ struct invokeSESEargs_t;
 
 
 typedef struct SESEvar_t {
-  //unsigned char mode;
-
   // the value when it is known will be placed
   // in this location, which can be accessed
   // as a variety of types
@@ -27,15 +25,7 @@ typedef struct SESEvar_t {
     float     sesetype_float;
     double    sesetype_double;
     void*     sesetype_object;
-  };
-  
-  // a statically or dynamically known SESE
-  // to gather the variable's value from
-  // if source==NULL it indicates the root
-  // SESE, which has no record, just normal
-  // temp names
-  //struct SESErecord_t* source;
-  //unsigned int         index;
+  };  
 } SESEvar;
 
 
@@ -44,21 +34,14 @@ typedef struct SESErecord_t {
   // are instances of one particular static code block
   int classID;
 
-
-  /* JUST USE POINTER TO SESErecord AS INSTANCE ID
-  // not globally unqiue, but each parent ensures that
-  // its children have unique identifiers, including to
-  // the parent itself
-  int instanceID;
-
-  // used to give out IDs to children
-  int childInstanceIDs;
-  */
-
   // pointers to SESEs directly above or below
   // in the heirarchy
-  struct SESErecord_t* parent;
-  struct Queue*        childrenList;
+  //struct SESErecord_t* parent;
+  //struct Queue*        childrenList;
+  // IMPLEMENT THIS LIKE STALLS--EVERY PARENTS EXIT MUST
+  // "STALL" on COMPLETETION OF ALL ISSUED CHILDREN, SO
+  // ALWAYS GIVE A CHILD A SEMAPHORE THAT IS ON YOUR LIST
+  // OF THINGS TO BLOCK ON AT EXIT
 
   // for state of vars after issue
   SESEvar* vars;
diff --git a/Robust/src/Runtime/psemaphore.c b/Robust/src/Runtime/psemaphore.c
new file mode 100644 (file)
index 0000000..63f91eb
--- /dev/null
@@ -0,0 +1,30 @@
+#include "psemaphore.h"
+
+
+int psem_init( psemaphore* sem ) {
+  if( pthread_mutex_init( &(sem->lock), NULL ) == -1 ) { return -1; }
+  if( pthread_cond_init ( &(sem->cond), NULL ) == -1 ) { return -1; }
+  sem->signaled = 0;
+  return 0;
+}
+
+
+int psem_take( psemaphore* sem ) {
+  if( pthread_mutex_lock  ( &(sem->lock) ) == -1 ) { return -1; }
+  while( !sem->signaled ) {
+    if( pthread_cond_wait ( &(sem->cond), &(sem->lock) ) == -1 ) { return -1; }
+  }
+  if( pthread_mutex_unlock( &(sem->lock) ) == -1 ) { return -1; }
+  return 0;
+}
+
+
+int psem_give( psemaphore* sem ) {
+  if( pthread_mutex_lock  ( &(sem->lock) ) == -1 ) { return -1; }
+  sem->signaled = 1;
+  if( pthread_cond_signal ( &(sem->cond) ) == -1 ) { return -1; }
+  if( pthread_mutex_unlock( &(sem->lock) ) == -1 ) { return -1; }
+
+}
+
+
diff --git a/Robust/src/Runtime/psemaphore.h b/Robust/src/Runtime/psemaphore.h
new file mode 100644 (file)
index 0000000..1575ff8
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef ___PSEMAPHORE_H__
+#define ___PSEMAPHORE_H__
+
+#include <pthread.h>
+
+
+typedef struct psemaphore_t {
+  pthread_mutex_t lock;
+  pthread_cond_t  cond;
+  int             signaled;
+} psemaphore;
+
+
+int psem_init( psemaphore* sem );
+int psem_take( psemaphore* sem );
+int psem_give( psemaphore* sem );
+
+
+#endif // ___PSEMAPHORE_H__
index 85d87fe3aa1c0b1ab61240469e8b67efd46cb663..a060d8579504ed4f409a440be91f2b26591d6752 100644 (file)
@@ -6,10 +6,10 @@ public class Test {
     int y = 1;
 
     sese fi {
-      if( true ) {
+      //if( true ) {
         x = y + 2;
         y = 3; 
-      }      
+       //}      
     }
 
 
@@ -23,9 +23,10 @@ public class Test {
     */
 
 
+    /*
     //  ADD BACK IN LATER, TO TEST STALLS
     // shouldn't cause a stall
-    //int z = x;
+    int z = x;
 
     // stall and get values for y and z
     x = x + 1;
@@ -33,15 +34,15 @@ public class Test {
     // all of these should proceed without stall
     y = y + 1;
     x = x + 1;
-    //z = z + 1;
-    
+    z = z + 1;
+    */
 
     // see that values from sese fi are
     // forwarded to this sibling
     //sese fo {
     // expecting x=5, y=4
     System.out.println( "x="+x+", y="+y );
-      //}
+    //}