void *thr_enqueuer(void *_count) { unsigned long long *count = _count; printf_verbose("thread_begin %s, tid %lu\n", "enqueuer", urcu_get_thread_id()); set_affinity(); rcu_register_thread(); while (!test_go) { } cmm_smp_mb(); for (;;) { struct test *node = malloc(sizeof(*node)); if (!node) goto fail; cds_lfq_node_init_rcu(&node->list); rcu_read_lock(); cds_lfq_enqueue_rcu(&q, &node->list); rcu_read_unlock(); URCU_TLS(nr_successful_enqueues)++; if (caa_unlikely(wdelay)) loop_sleep(wdelay); fail: URCU_TLS(nr_enqueues)++; if (caa_unlikely(!test_duration_enqueue())) break; } rcu_unregister_thread(); count[0] = URCU_TLS(nr_enqueues); count[1] = URCU_TLS(nr_successful_enqueues); printf_verbose("enqueuer thread_end, tid %lu, " "enqueues %llu successful_enqueues %llu\n", urcu_get_thread_id(), URCU_TLS(nr_enqueues), URCU_TLS(nr_successful_enqueues)); return ((void*)1); }
int main(int argc, char **argv) { int values[] = { -5, 42, 36, 24, }; struct cds_lfq_queue_rcu myqueue; /* Queue */ unsigned int i; int ret = 0; /* * Each thread need using RCU read-side need to be explicitly * registered. */ urcu_memb_register_thread(); cds_lfq_init_rcu(&myqueue, urcu_memb_call_rcu); /* * Enqueue nodes. */ for (i = 0; i < CAA_ARRAY_SIZE(values); i++) { struct mynode *node; node = malloc(sizeof(*node)); if (!node) { ret = -1; goto end; } cds_lfq_node_init_rcu(&node->node); node->value = values[i]; /* * Both enqueue and dequeue need to be called within RCU * read-side critical section. */ urcu_memb_read_lock(); cds_lfq_enqueue_rcu(&myqueue, &node->node); urcu_memb_read_unlock(); } end: urcu_memb_unregister_thread(); return ret; }