Add runtime support for STM Barrier class
[IRC.git] / Robust / src / Runtime / Queue.c
index a29e96b083116d37f9de2149b66a01f4f009b56d..33bfcc700e30cb7728086652a7ee06e8782f616d 100644 (file)
@@ -5,11 +5,14 @@
 #endif
 
 struct Queue * createQueue() {
-  return RUNMALLOC(sizeof(struct Queue));
+  struct Queue * queue = (struct Queue *)RUNMALLOC(sizeof(struct Queue));
+  queue->head = NULL;
+  queue->tail = NULL;
+  return queue;
 }
 
-int isEmpty(struct Queue *queue) {
-  return queue->head==NULL;
+void freeQueue(struct Queue * q) {
+  RUNFREE(q);
 }
 
 struct QueueItem * addNewItem(struct Queue * queue, void * ptr) {
@@ -27,6 +30,33 @@ struct QueueItem * addNewItem(struct Queue * queue, void * ptr) {
   return item;
 }
 
+#ifdef RAW
+struct QueueItem * addNewItem_I(struct Queue * queue, void * ptr) {
+  struct QueueItem * item=RUNMALLOC_I(sizeof(struct QueueItem));
+  item->objectptr=ptr;
+  item->queue=queue;
+  if (queue->head==NULL) {
+    queue->head=item;
+    queue->tail=item;
+  } else {
+    item->next=queue->head;
+    queue->head->prev=item;
+    queue->head=item;
+  }
+  return item;
+}
+#endif
+
+struct QueueItem * findItem(struct Queue * queue, void *ptr) {
+  struct QueueItem * item=queue->head;
+  while(item!=NULL) {
+    if (item->objectptr==ptr)
+      return item;
+    item=item->next;
+  }
+  return NULL;
+}
+
 void removeItem(struct Queue * queue, struct QueueItem * item) {
   struct QueueItem * prev=item->prev;
   struct QueueItem * next=item->next;
@@ -45,6 +75,14 @@ struct QueueItem * getTail(struct Queue * queue) {
   return queue->tail;
 }
 
-struct QueueItem * getNext(struct QueueItem * qi) {
+struct QueueItem * getNextQueueItem(struct QueueItem * qi) {
   return qi->next;
 }
+
+void * getItem(struct Queue * queue) {
+  struct QueueItem * q=queue->head;
+  void * ptr=q->objectptr;
+  queue->head=q->next;
+  RUNFREE(q);
+  return ptr;
+}