add profiling....
[IRC.git] / Robust / src / Runtime / Queue.c
index a058d3f1e72a46be01c352a8c0e1f512e67ed668..3429dc6bffd0aea2ecdbe97f576392705b9326c1 100644 (file)
@@ -16,6 +16,11 @@ struct Queue * createQueue() {
   return queue;
 }
 
+void initQueue(struct Queue * q) {
+  q->head=NULL;
+  q->tail=NULL;
+}
+
 void freeQueue(struct Queue * q) {
   RUNFREE(q);
 }
@@ -57,6 +62,13 @@ struct QueueItem * addNewItemBack(struct Queue * queue, void * ptr) {
 }
 
 #ifdef MULTICORE
+struct Queue * createQueue_I() {
+  struct Queue * queue = (struct Queue *)RUNMALLOC_I(sizeof(struct Queue));
+  queue->head = NULL;
+  queue->tail = NULL;
+  return queue;
+}
+
 struct QueueItem * addNewItem_I(struct Queue * queue, void * ptr) {
   struct QueueItem * item=RUNMALLOC_I(sizeof(struct QueueItem));
   item->objectptr=ptr;
@@ -73,6 +85,18 @@ struct QueueItem * addNewItem_I(struct Queue * queue, void * ptr) {
 }
 #endif
 
+struct QueueItem * getTail(struct Queue * queue) {
+  return queue->tail;
+}
+
+struct QueueItem * getHead(struct Queue * queue) {
+  return queue->head;
+}
+
+struct QueueItem * getNextQueueItem(struct QueueItem * qi) {
+  return qi->next;
+}
+
 struct QueueItem * findItem(struct Queue * queue, void *ptr) {
   struct QueueItem * item=queue->head;
   while(item!=NULL) {
@@ -97,14 +121,6 @@ void removeItem(struct Queue * queue, struct QueueItem * item) {
   RUNFREE(item);
 }
 
-struct QueueItem * getTail(struct Queue * queue) {
-  return queue->tail;
-}
-
-struct QueueItem * getNextQueueItem(struct QueueItem * qi) {
-  return qi->next;
-}
-
 void * getItem(struct Queue * queue) {
   struct QueueItem * q=queue->head;
   void * ptr=q->objectptr;
@@ -114,6 +130,9 @@ void * getItem(struct Queue * queue) {
     q->next->prev=NULL;
   }
   queue->head=q->next;
+  if(queue->tail == q) {
+    queue->tail = NULL;
+  }
   RUNFREE(q);
   return ptr;
 }
@@ -131,6 +150,29 @@ void * getItemBack(struct Queue * queue) {
   return ptr;
 }
 
+void * peekItem(struct Queue * queue) {
+  struct QueueItem * q=queue->head;
+  void * ptr=q->objectptr;
+  return ptr;
+}
+
+void * peekItemBack(struct Queue * queue) {
+  struct QueueItem * q=queue->tail;
+  void * ptr=q->objectptr;
+  return ptr;
+}
+
+void clearQueue(struct Queue * queue) {
+  struct QueueItem * item=queue->head;
+  while(item!=NULL) {
+    struct QueueItem * next=item->next;
+    RUNFREE(item);
+    item=next;
+  }
+  queue->head=queue->tail=NULL;
+  return;
+}
+
 #ifdef DEBUG_QUEUE
 int assertQueue(struct Queue * queue) {
 
@@ -151,7 +193,7 @@ int assertQueue(struct Queue * queue) {
         return 0;
       }
 
-    // i->prev != NULL
+      // i->prev != NULL
     } else {
       if( i->prev->next == NULL ) {
         return 0;
@@ -165,7 +207,7 @@ int assertQueue(struct Queue * queue) {
         return 0;
       }
 
-    // i->next != NULL
+      // i->next != NULL
     } else {
       if( i->next->prev == NULL ) {
         return 0;
@@ -188,8 +230,8 @@ void printQueue(struct Queue * queue) {
   struct QueueItem* i;
 
   printf("Queue empty? %d\n", isEmpty(queue));
-  
-  printf("head        ");  
+
+  printf("head        ");
   i = queue->head;
   while( i != NULL ) {
     printf("item        ");