changes
authorbdemsky <bdemsky>
Wed, 13 Oct 2010 03:33:47 +0000 (03:33 +0000)
committerbdemsky <bdemsky>
Wed, 13 Oct 2010 03:33:47 +0000 (03:33 +0000)
Robust/src/Runtime/oooJava/Queue_RCR.c
Robust/src/Runtime/oooJava/Queue_RCR.h
Robust/src/Runtime/oooJava/rcr_runtime.c [new file with mode: 0644]
Robust/src/Runtime/oooJava/rcr_runtime.h [new file with mode: 0644]
Robust/src/Runtime/oooJava/trqueue.c [new file with mode: 0644]
Robust/src/Runtime/oooJava/trqueue.h [new file with mode: 0644]

index c7400f6d2fb63f8f614aec3ffd3884bed34ddb57..f9449b0a2c5434d075940e6c81cca06e12890cd0 100644 (file)
@@ -4,51 +4,42 @@
 
 __thread struct RCRQueue myRCRQueue;
 
-void resetRCRQueue()
-{
+void resetRCRQueue() {
   myRCRQueue.head = 0;
   myRCRQueue.tail = 0;
-  myRCRQueue.size = 0;
 }
 
-
 //0 would mean sucess
 //1 would mean fail
 //since if we reach SIZE, we will stop operation, it doesn't matter
 //that we overwrite the element in the queue
-int enqueueRCRQueue(void * ptr)
-{
-  myRCRQueue.elements[myRCRQueue.head++] =  ptr;
-
-  if(myRCRQueue.head & SIZE)
-    myRCRQueue.head = 0;
-
-  return myRCRQueue.size++ == SIZE;
+int enqueueRCRQueue(void * ptr) {
+  unsigned int head=myRCRQueue.head+1;
+  if (head&SIZE)
+    head=0;
+
+  if (head==myRCRQueue.tail)
+    return 1;
+  
+  myRCRQueue.elements[head] = ptr;
+  myRCRQueue.head=head;
+  return 0;
 }
 
-void * dequeueRCRQueue()
-{  
-  if(myRCRQueue.size) {
-    void * ptr = myRCRQueue.elements[myRCRQueue.tail++];
-
-    if(myRCRQueue.tail & SIZE)
-      myRCRQueue.tail =  0;
-    
-
-    myRCRQueue.size--;
-    return ptr;
-  } else
+void * dequeueRCRQueue() {
+  if(myRCRQueue.head==myRCRQueue.tail)
     return NULL;
+  unsigned int tail=myRCRQueue.tail;
+  void * ptr = myRCRQueue.elements[tail];
+  tail++;
+  if(tail & SIZE)
+    tail =  0;
+  myRXRQueue.tail=tail;
+  return ptr;
 }
 
-int isEmptyRCRQueue()
-{
-  return !myRCRQueue.size;
-}
-
-int getSizeRCRQueue()
-{
-  return myRCRQueue.size;
+int isEmptyRCRQueue() {
+  return myRCRQueue.head=myRCRQueue.tail;
 }
 
 
index 5f1f059e95478a09402ae1a059ae846fcb7af86d..a500cce87738f278c94d8bd9a48d1593b1a54bbc 100644 (file)
@@ -9,7 +9,6 @@ struct RCRQueue {
   void * elements[SIZE];
   unsigned int head;
   unsigned int tail;
-  unsigned int size;
 };
 
 int enqueueRCRQueue(void * ptr);
@@ -17,5 +16,4 @@ void * dequeueRCRQueue();
 void resetRCRQueue();
 int isEmptyRCRQueue();
 int getSizeRCRQueue();
-
 #endif
diff --git a/Robust/src/Runtime/oooJava/rcr_runtime.c b/Robust/src/Runtime/oooJava/rcr_runtime.c
new file mode 100644 (file)
index 0000000..f0382d6
--- /dev/null
@@ -0,0 +1,8 @@
+#include "rcr_runtime.h"
+
+void workerTR(void *x) {
+  struct trQueue * queue=(struct trQueue *)x;
+  while(true) {
+    
+  }
+}
diff --git a/Robust/src/Runtime/oooJava/rcr_runtime.h b/Robust/src/Runtime/oooJava/rcr_runtime.h
new file mode 100644 (file)
index 0000000..bcc90a0
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef RCR_RUNTIME_H
+#define RCR_RUNTIME_H
+
+extern __thread struct trqueue * TRqueue;
+
+void workerTR(void *);
+
+#endif
diff --git a/Robust/src/Runtime/oooJava/trqueue.c b/Robust/src/Runtime/oooJava/trqueue.c
new file mode 100644 (file)
index 0000000..d58a33f
--- /dev/null
@@ -0,0 +1,42 @@
+#include "trqueue.h"
+#include "stdlib.h"
+#include "stdio.h"
+
+//0 would mean sucess
+//1 would mean fail
+//since if we reach SIZE, we will stop operation, it doesn't matter
+//that we overwrite the element in the queue
+void enqueueTR(trQueue *q, void * ptr) {
+  unsigned int head=q->head+1;
+  if (head&TRSIZE)
+    head=0;
+
+  while (head==q->tail)
+    sched_yield();
+  
+  q->elements[head] = ptr;
+  BARRIER();
+  q->head=head;
+  return 0;
+}
+
+void * dequeueTR(trQueue *q) {
+  unsigned int tail=q->tail;
+  if(q->head==tail)
+    return NULL;
+
+  void * ptr = q->elements[tail];
+  tail++;
+  if(tail & TRSIZE)
+    tail =  0;
+  q->tail=tail;
+  return ptr;
+}
+
+struct trQueue * allocTR() {
+  struct trQueue *ptr=malloc(sizeof(struct trQueue));
+  ptr->head=0;
+  ptr->tail=0;
+  return ptr;
+}
+
diff --git a/Robust/src/Runtime/oooJava/trqueue.h b/Robust/src/Runtime/oooJava/trqueue.h
new file mode 100644 (file)
index 0000000..c1f83c2
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef TRQUEUE_H_
+#define TRQUEUE_H_
+
+//NOTE: SIZE MUST BE A POWER OF TWO;
+//SIZE is used as mask to check overflow
+#define SIZE 16384
+
+struct trQueue {
+  void * elements[SIZE];
+  volatile unsigned int head;
+  char buffer[60];//buffer us to the next cache line
+  volatile unsigned int tail;
+};
+
+void enqueueTR(struct trQueue *, void * ptr);
+void * dequeueTR(struct trQueue *);
+struct trQueue * allocTR();
+#endif