X-Git-Url: https://git.lttng.org/?p=urcu.git;a=blobdiff_plain;f=tests%2Ftest_urcu_wfcq.c;h=124968d3ec702fd89368edc8ecf565710f771f0f;hp=ccd5cf169436171baadd50d46ce261892764666b;hb=2953b501ab1dcf908d07de9b414a08397519f5b6;hpb=cf9451dc7ee26459a84772338cc1470903657407 diff --git a/tests/test_urcu_wfcq.c b/tests/test_urcu_wfcq.c index ccd5cf1..124968d 100644 --- a/tests/test_urcu_wfcq.c +++ b/tests/test_urcu_wfcq.c @@ -34,11 +34,12 @@ #include #include #include -#include #include #include #include +#include +#include "cpuset.h" #ifdef __linux__ #include @@ -65,16 +66,17 @@ static inline pid_t gettid(void) #ifndef DYNAMIC_LINK_TEST #define _LGPL_SOURCE #endif -#include #include enum test_sync { - TEST_SYNC_MUTEX = 0, - TEST_SYNC_NONE, + TEST_SYNC_NONE = 0, + TEST_SYNC_MUTEX, }; static enum test_sync test_sync; +static int test_force_sync; + static volatile int test_go, test_stop_enqueue, test_stop_dequeue; static unsigned long rduration; @@ -107,12 +109,6 @@ static int use_affinity = 0; pthread_mutex_t affinity_mutex = PTHREAD_MUTEX_INITIALIZER; -#ifndef HAVE_CPU_SET_T -typedef unsigned long cpu_set_t; -# define CPU_ZERO(cpuset) do { *(cpuset) = 0; } while(0) -# define CPU_SET(cpu, cpuset) do { *(cpuset) |= (1UL << (cpu)); } while(0) -#endif - static void set_affinity(void) { #if HAVE_SCHED_SETAFFINITY @@ -349,8 +345,8 @@ static void show_usage(int argc, char **argv) printf(" [-q] (test dequeue)"); printf(" [-s] (test splice, enabled by default)"); printf(" [-M] (use mutex external synchronization)"); - printf(" [-0] (use no external synchronization)"); - printf(" Note: default: mutex external synchronization used."); + printf(" Note: default: no external synchronization used."); + printf(" [-f] (force user-provided synchronization)"); printf(" [-w] Wait for dequeuer to empty queue"); printf("\n"); } @@ -432,12 +428,12 @@ int main(int argc, char **argv) case 'M': test_sync = TEST_SYNC_MUTEX; break; - case '0': - test_sync = TEST_SYNC_NONE; - break; case 'w': test_wait_empty = 1; break; + case 'f': + test_force_sync = 1; + break; } } @@ -445,6 +441,17 @@ int main(int argc, char **argv) if (!test_dequeue && !test_splice) test_splice = 1; + if (test_sync == TEST_SYNC_NONE && nr_dequeuers > 1 && test_dequeue) { + if (test_force_sync) { + fprintf(stderr, "[WARNING] Using dequeue concurrently " + "with other dequeue or splice 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); @@ -531,7 +538,7 @@ int main(int argc, char **argv) tot_enqueues, tot_dequeues); printf_verbose("total number of successful enqueues : %llu, " "enqueues to empty dest : %llu, " - "successful dequeues %llu, ", + "successful dequeues %llu, " "splice : %llu\n", tot_successful_enqueues, tot_empty_dest_enqueues,