Alter the ring buffer library headers to have both atomic and non-atomic insertion...
[pub/USBasp.git] / Projects / XPLAINBridge / Lib / LightweightRingBuff.h
index 1dc0593..9c25707 100644 (file)
                        Buffer->Count = 0;
                }
                
-               /** Inserts an element into the ring buffer.
+               /** Atomically inserts an element into the ring buffer.
                 *
                 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into
                 *  \param[in]     Data    Data element to insert into the buffer
                 */
-               static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data)
+               static inline void RingBuffer_AtomicInsert(RingBuff_t* const Buffer, RingBuff_Data_t Data)
                {
                        ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
                        {
                        }
                }
 
-               /** Retrieves an element from the ring buffer.
+               /** Atomically retrieves an element from the ring buffer.
                 *
                 *  \param[in,out] Buffer  Pointer to a ring buffer structure to retrieve from
                 *
                 *  \return Next data element stored in the buffer
                 */
-               static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer)
+               static inline RingBuff_Data_t RingBuffer_AtomicRemove(RingBuff_t* const Buffer)
                {
                        RingBuff_Data_t Data;
                        
                        return Data;
                }
 
+               /** Inserts an element into the ring buffer.
+                *
+                *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into
+                *  \param[in]     Data    Data element to insert into the buffer
+                */
+               static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data)
+               {
+                       *Buffer->In = Data;
+                       
+                       if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE])
+                         Buffer->In = Buffer->Buffer;
+                                 
+                       Buffer->Count++;
+               }
+
+               /** Retrieves an element from the ring buffer.
+                *
+                *  \param[in,out] Buffer  Pointer to a ring buffer structure to retrieve from
+                *
+                *  \return Next data element stored in the buffer
+                */
+               static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer)
+               {
+                       RingBuff_Data_t Data = *Buffer->Out;
+                       
+                       if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE])
+                         Buffer->Out = Buffer->Buffer;
+                                 
+                       Buffer->Count--;
+
+                       return Data;
+               }
+
 #endif
  
\ No newline at end of file