X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=tests%2Ftest_urcu_wfs.c;h=e36b822569e6a821fe3ad8841a6c9d34801ddb66;hb=0ee400bd2f2a5f6a62808c1c95f2d63c96b5733e;hp=5e7b0ec4367fbcb2b94ee2a5452e741788d1efe2;hpb=69328034b804a0fc180c08f7ca6be1a4446bb105;p=urcu.git diff --git a/tests/test_urcu_wfs.c b/tests/test_urcu_wfs.c index 5e7b0ec..e36b822 100644 --- a/tests/test_urcu_wfs.c +++ b/tests/test_urcu_wfs.c @@ -78,6 +78,8 @@ enum test_sync { static enum test_sync test_sync; +static int test_force_sync; + static volatile int test_go, test_stop; static unsigned long rduration; @@ -172,12 +174,13 @@ static unsigned int nr_dequeuers; static struct cds_wfs_stack s; -void *thr_enqueuer(void *_count) +static void *thr_enqueuer(void *_count) { unsigned long long *count = _count; printf_verbose("thread_begin %s, thread id : %lx, tid %lu\n", - "enqueuer", pthread_self(), (unsigned long)gettid()); + "enqueuer", (unsigned long) pthread_self(), + (unsigned long) gettid()); set_affinity(); @@ -206,7 +209,8 @@ fail: count[1] = URCU_TLS(nr_successful_enqueues); printf_verbose("enqueuer thread_end, thread id : %lx, tid %lu, " "enqueues %llu successful_enqueues %llu\n", - pthread_self(), (unsigned long)gettid(), + pthread_self(), + (unsigned long) gettid(), URCU_TLS(nr_enqueues), URCU_TLS(nr_successful_enqueues)); return ((void*)1); @@ -247,13 +251,14 @@ static void do_test_pop_all(enum test_sync sync) } } -void *thr_dequeuer(void *_count) +static void *thr_dequeuer(void *_count) { unsigned long long *count = _count; unsigned int counter; printf_verbose("thread_begin %s, thread id : %lx, tid %lu\n", - "dequeuer", pthread_self(), (unsigned long)gettid()); + "dequeuer", (unsigned long) pthread_self(), + (unsigned long) gettid()); set_affinity(); @@ -286,14 +291,15 @@ void *thr_dequeuer(void *_count) printf_verbose("dequeuer thread_end, thread id : %lx, tid %lu, " "dequeues %llu, successful_dequeues %llu\n", - pthread_self(), (unsigned long)gettid(), + pthread_self(), + (unsigned long) gettid(), URCU_TLS(nr_dequeues), URCU_TLS(nr_successful_dequeues)); count[0] = URCU_TLS(nr_dequeues); count[1] = URCU_TLS(nr_successful_dequeues); return ((void*)2); } -void test_end(struct cds_wfs_stack *s, unsigned long long *nr_dequeues) +static void test_end(struct cds_wfs_stack *s, unsigned long long *nr_dequeues) { struct cds_wfs_node *node; @@ -306,7 +312,7 @@ void test_end(struct cds_wfs_stack *s, unsigned long long *nr_dequeues) } while (node); } -void show_usage(int argc, char **argv) +static void show_usage(int argc, char **argv) { printf("Usage : %s nr_dequeuers nr_enqueuers duration (s)", argv[0]); printf(" [-d delay] (enqueuer period (in loops))"); @@ -317,6 +323,7 @@ void show_usage(int argc, char **argv) printf(" [-P] (test pop_all, enabled by default)"); printf(" [-M] (use mutex external synchronization)"); printf(" Note: default: no external synchronization used."); + printf(" [-f] (force user-provided synchronization)"); printf("\n"); } @@ -395,6 +402,9 @@ int main(int argc, char **argv) case 'M': test_sync = TEST_SYNC_MUTEX; break; + case 'f': + test_force_sync = 1; + break; } } @@ -402,6 +412,17 @@ int main(int argc, char **argv) if (!test_pop && !test_pop_all) test_pop_all = 1; + if (test_sync == TEST_SYNC_NONE && nr_dequeuers > 1 && test_pop) { + if (test_force_sync) { + fprintf(stderr, "[WARNING] Using pop concurrently " + "with other pop or pop_all without external " + "synchronization. Expect run-time failure.\n"); + } else { + printf("Enforcing mutex synchronization\n"); + test_sync = TEST_SYNC_MUTEX; + } + } + printf_verbose("running test for %lu seconds, %u enqueuers, " "%u dequeuers.\n", duration, nr_enqueuers, nr_dequeuers); @@ -409,10 +430,15 @@ int main(int argc, char **argv) printf_verbose("pop test activated.\n"); if (test_pop_all) printf_verbose("pop_all test activated.\n"); + if (test_sync == TEST_SYNC_MUTEX) + printf_verbose("External sync: mutex.\n"); + else + printf_verbose("External sync: none.\n"); printf_verbose("Writer delay : %lu loops.\n", rduration); printf_verbose("Reader duration : %lu loops.\n", wdelay); printf_verbose("thread %-6s, thread id : %lx, tid %lu\n", - "main", pthread_self(), (unsigned long)gettid()); + "main", (unsigned long) pthread_self(), + (unsigned long) gettid()); tid_enqueuer = malloc(sizeof(*tid_enqueuer) * nr_enqueuers); tid_dequeuer = malloc(sizeof(*tid_dequeuer) * nr_dequeuers);