File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -11,7 +11,7 @@ typedef struct {
1111 _Alignas(64 ) atomic_size_t head ;
1212 _Alignas(64 ) atomic_size_t tail ;
1313 size_t mask ;
14- data_t * * buffer ;
14+ data_t * * buffer ;
1515} spsc_queue_t ;
1616
1717bool spsc_init (spsc_queue_t * q , size_t size );
@@ -22,4 +22,6 @@ bool spsc_enqueue(spsc_queue_t *q, data_t *item);
2222
2323bool spsc_dequeue (spsc_queue_t * q , data_t * * item );
2424
25+ bool spsc_is_empty (spsc_queue_t * q );
26+
2527#endif //SPSC_QUEUE_LIBRARY_H
Original file line number Diff line number Diff line change @@ -58,3 +58,11 @@ bool spsc_dequeue(spsc_queue_t *q, data_t **item)
5858 atomic_store_explicit (& q -> head , current_head + 1 , memory_order_release );
5959 return true;
6060}
61+
62+ bool spsc_is_empty (spsc_queue_t * q )
63+ {
64+ size_t head = atomic_load_explicit (& q -> head , memory_order_acquire );
65+ size_t tail = atomic_load_explicit (& q -> tail , memory_order_acquire );
66+ return head == tail ;
67+ }
68+
Original file line number Diff line number Diff line change @@ -13,16 +13,21 @@ TEST(QueueTests, test1)
1313 spsc_queue_t queue;
1414 spsc_init (&queue, 512 );
1515
16+ ASSERT_TRUE (spsc_is_empty (&queue));
17+
1618 data_t test = {nullptr , 1 , 2 , 3 };
1719 ASSERT_TRUE (spsc_enqueue (&queue, &test));
20+ ASSERT_FALSE (spsc_is_empty (&queue));
1821
1922 data_t *test2 = nullptr ;
2023 ASSERT_TRUE (spsc_dequeue (&queue, &test2));
2124 ASSERT_EQ (test.size , (*test2).size );
2225 ASSERT_EQ (test.width , (*test2).width );
2326 ASSERT_EQ (test.cap , (*test2).cap );
27+ ASSERT_TRUE (spsc_is_empty (&queue));
2428
2529 ASSERT_FALSE (spsc_dequeue (&queue, &test2));
30+ ASSERT_TRUE (spsc_is_empty (&queue));
2631
2732 spsc_destroy (&queue);
2833}
You can’t perform that action at this time.
0 commit comments