Delay reader in loops, not us
[urcu.git] / test_urcu.c
index 58612815f3c2bbd4882593edf549f935f152593e..fe469284ef1122f864ed9bb467ef49997cbb1afa 100644 (file)
@@ -20,6 +20,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#define _GNU_SOURCE
 #include <stdio.h>
 #include <pthread.h>
 #include <stdlib.h>
@@ -30,6 +31,7 @@
 #include <stdio.h>
 #include <assert.h>
 #include <sys/syscall.h>
+#include <sched.h>
 
 #include "arch.h"
 
@@ -67,6 +69,15 @@ static struct test_array *test_rcu_pointer;
 
 static unsigned long duration;
 
+/* read-side C.S. duration, in loops */
+static unsigned long rduration;
+
+static inline void loop_sleep(unsigned long l)
+{
+       while(l-- != 0)
+               cpu_relax();
+}
+
 /*
  * returns 0 if test should end.
  */
@@ -166,6 +177,8 @@ void *thr_reader(void *_count)
                debug_yield_read();
                if (local_ptr)
                        assert(local_ptr->a == 8);
+               if (unlikely(rduration))
+                       loop_sleep(rduration);
                rcu_read_unlock();
                nr_reads++;
                if (unlikely(!test_duration_read()))
@@ -227,9 +240,13 @@ void show_usage(int argc, char **argv)
        printf(" [-r] [-w] (yield reader and/or writer)");
 #endif
        printf(" [-d delay] (writer period (us))");
+       printf(" [-c duration] (reader C.S. duration (in loops))");
+       printf(" [-a cpu#] [-a cpu#]... (affinity)");
        printf("\n");
 }
 
+cpu_set_t affinity;
+
 int main(int argc, char **argv)
 {
        int err;
@@ -237,7 +254,8 @@ int main(int argc, char **argv)
        void *tret;
        unsigned long long *count_reader, *count_writer;
        unsigned long long tot_reads = 0, tot_writes = 0;
-       int i;
+       int i, a;
+       int use_affinity = 0;
 
        if (argc < 4) {
                show_usage(argc, argv);
@@ -262,6 +280,8 @@ int main(int argc, char **argv)
                return -1;
        }
 
+       CPU_ZERO(&affinity);
+
        for (i = 4; i < argc; i++) {
                if (argv[i][0] != '-')
                        continue;
@@ -274,6 +294,23 @@ int main(int argc, char **argv)
                        yield_active |= YIELD_WRITE;
                        break;
 #endif
+               case 'a':
+                       if (argc < i + 2) {
+                               show_usage(argc, argv);
+                               return -1;
+                       }
+                       a = atoi(argv[++i]);
+                       CPU_SET(a, &affinity);
+                       use_affinity = 1;
+                       printf("Adding CPU %d affinity\n", a);
+                       break;
+               case 'c':
+                       if (argc < i + 2) {
+                               show_usage(argc, argv);
+                               return -1;
+                       }
+                       rduration = atoi(argv[++i]);
+                       break;
                case 'd':
                        if (argc < i + 2) {
                                show_usage(argc, argv);
@@ -290,6 +327,12 @@ int main(int argc, char **argv)
        printf("thread %-6s, thread id : %lx, tid %lu\n",
                        "main", pthread_self(), (unsigned long)gettid());
 
+       if (use_affinity
+           && sched_setaffinity(0, sizeof(affinity), &affinity) < 0) {
+               perror("sched_setaffinity");
+               exit(-1);
+       }
+
        test_array = malloc(sizeof(*test_array) * ARRAY_SIZE);
        tid_reader = malloc(sizeof(*tid_reader) * nr_readers);
        tid_writer = malloc(sizeof(*tid_writer) * nr_writers);
This page took 0.023324 seconds and 4 git commands to generate.