Delay reader in loops, not us
[urcu.git] / test_qsbr.c
index 82521efcf83a9babbf743f7741ad05a473efabb6..488c9041b1aae96d267aa6ea8e3ec4f027fc3032 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"
 
@@ -63,6 +65,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.
  */
@@ -162,6 +173,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++;
                /* QS each 1024 reads */
@@ -226,9 +239,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;
@@ -236,7 +253,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);
@@ -261,6 +279,8 @@ int main(int argc, char **argv)
                return -1;
        }
 
+       CPU_ZERO(&affinity);
+
        for (i = 4; i < argc; i++) {
                if (argv[i][0] != '-')
                        continue;
@@ -273,6 +293,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);
@@ -289,6 +326,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.024006 seconds and 4 git commands to generate.