LocklessQueue.hpp 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #ifndef _LOCKLESS_QUEUE_H_
  2. #define _LOCKLESS_QUEUE_H_
  3. #include <FpConfig.hpp>
  4. #include <Os/Queue.hpp>
  5. #ifndef BUILD_DARWIN // Allow compiling
  6. #include <mqueue.h>
  7. #endif
  8. namespace Os {
  9. class LocklessQueue {
  10. typedef struct QueueNode_s {
  11. U8 * data;
  12. NATIVE_INT_TYPE size;
  13. struct QueueNode_s * next;
  14. } QueueNode;
  15. public:
  16. LocklessQueue (NATIVE_INT_TYPE maxmsg, NATIVE_INT_TYPE msgsize);
  17. ~LocklessQueue();
  18. #ifndef BUILD_DARWIN // Allow compiling
  19. void GetAttr (mq_attr & attr);
  20. #endif
  21. Os::Queue::QueueStatus Send (const U8 * buffer, NATIVE_INT_TYPE size);
  22. Os::Queue::QueueStatus Receive (U8 * buffer, NATIVE_INT_TYPE capacity, NATIVE_INT_TYPE & size);
  23. private:
  24. bool PopFree (QueueNode ** free_node);
  25. void PushFree (QueueNode * my_node);
  26. QueueNode * m_first;
  27. QueueNode * m_last;
  28. QueueNode * m_free_head;
  29. QueueNode * m_index;
  30. U8 * m_data;
  31. #ifndef BUILD_DARWIN
  32. mq_attr m_attr;
  33. #endif
  34. };
  35. }
  36. #endif