+static void do_test_pop(enum test_sync sync)
+{
+ struct cds_wfs_node *node;
+ int state;
+
+ if (sync == TEST_SYNC_MUTEX)
+ cds_wfs_pop_lock(&s);
+ node = __cds_wfs_pop_with_state_blocking(&s, &state);
+ if (sync == TEST_SYNC_MUTEX)
+ cds_wfs_pop_unlock(&s);
+
+ if (node) {
+ if (state & CDS_WFS_STATE_LAST)
+ URCU_TLS(nr_pop_last)++;
+ free(node);
+ URCU_TLS(nr_successful_dequeues)++;
+ }
+ URCU_TLS(nr_dequeues)++;
+}
+
+static void do_test_pop_all(enum test_sync sync)
+{
+ struct cds_wfs_head *head;
+ struct cds_wfs_node *node, *n;
+
+ if (sync == TEST_SYNC_MUTEX)
+ cds_wfs_pop_lock(&s);
+ head = __cds_wfs_pop_all(&s);
+ if (sync == TEST_SYNC_MUTEX)
+ cds_wfs_pop_unlock(&s);
+
+ /* Check if empty */
+ if (cds_wfs_first(head) == NULL)
+ return;
+
+ URCU_TLS(nr_pop_all)++;
+ URCU_TLS(nr_pop_last)++;
+
+ cds_wfs_for_each_blocking_safe(head, node, n) {
+ free(node);
+ URCU_TLS(nr_successful_dequeues)++;
+ URCU_TLS(nr_dequeues)++;
+ }
+}
+
+static void *thr_dequeuer(void *_count)