refactors
[clinton/Smoothieware.git] / src / libs / HeapRing.cpp
index f3e0809..a75411c 100644 (file)
 template<class kind> HeapRing<kind>::HeapRing()
 {
     head_i = tail_i = length = 0;
+    isr_tail_i = tail_i;
     ring = NULL;
 }
 
 template<class kind> HeapRing<kind>::HeapRing(unsigned int length)
 {
     head_i = tail_i = 0;
+    isr_tail_i = tail_i;
     ring = new kind[length];
     // TODO: handle allocation failure
     this->length = length;
@@ -29,6 +31,7 @@ template<class kind> HeapRing<kind>::HeapRing(unsigned int length)
 template<class kind> HeapRing<kind>::~HeapRing()
 {
     head_i = tail_i = length = 0;
+    isr_tail_i = tail_i;
     if (ring)
         delete [] ring;
     ring = NULL;
@@ -38,7 +41,7 @@ template<class kind> HeapRing<kind>::~HeapRing()
  * index accessors (protected)
  */
 
-template<class kind> unsigned int HeapRing<kind>::next(unsigned int item)
+template<class kind> unsigned int HeapRing<kind>::next(unsigned int item) const
 {
     if (length == 0)
         return 0;
@@ -49,7 +52,7 @@ template<class kind> unsigned int HeapRing<kind>::next(unsigned int item)
     return item;
 }
 
-template<class kind> unsigned int HeapRing<kind>::prev(unsigned int item)
+template<class kind> unsigned int HeapRing<kind>::prev(unsigned int item) const
 {
     if (length == 0)
         return 0;
@@ -113,26 +116,36 @@ template<class kind> kind* HeapRing<kind>::item_ref(unsigned int i)
 
 template<class kind> void HeapRing<kind>::produce_head()
 {
+    while (is_full());
     head_i = next(head_i);
 }
 
 template<class kind> void HeapRing<kind>::consume_tail()
 {
-    tail_i = next(tail_i);
+    if (!is_empty())
+        tail_i = next(tail_i);
 }
 
 /*
  * queue status accessors
  */
 
-template<class kind> bool HeapRing<kind>::is_full()
+template<class kind> bool HeapRing<kind>::is_full() const
 {
-    return (next(head_i) == tail_i);
+    //__disable_irq();
+    bool r = (next(head_i) == tail_i);
+    //__enable_irq();
+
+    return r;
 }
 
-template<class kind> bool HeapRing<kind>::is_empty()
+template<class kind> bool HeapRing<kind>::is_empty() const
 {
-    return (head_i == tail_i);
+    //__disable_irq();
+    bool r = (head_i == tail_i);
+    //__enable_irq();
+
+    return r;
 }
 
 /*