runs
[urcu.git] / test_urcu.c
1 #include <stdio.h>
2 #include <pthread.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <sys/types.h>
6 #include <sys/wait.h>
7 #include <unistd.h>
8 #include <stdio.h>
9 #include <assert.h>
10 #include "urcu.h"
11
12 struct test_array {
13 int a;
14 int b;
15 char c[200];
16 };
17
18 static struct test_array *test_rcu_pointer;
19
20 #define NR_READ 1000
21 #define NR_WRITE 50
22
23
24 void *thr_reader(void *arg)
25 {
26 int qparity, i;
27 struct test_array *local_ptr;
28
29 printf("thread %s, thread id : %lu, pid %lu\n",
30 "reader", pthread_self(), getpid());
31 sleep(2);
32
33 urcu_register_thread();
34
35 for (i = 0; i < 1000; i++) {
36 qparity = rcu_read_lock();
37 local_ptr = rcu_dereference(test_rcu_pointer);
38 if (local_ptr) {
39 assert(local_ptr->a == 8);
40 assert(local_ptr->b == 12);
41 assert(local_ptr->c[55] == 2);
42 }
43 rcu_read_unlock(qparity);
44 }
45
46 urcu_unregister_thread();
47
48 return ((void*)1);
49
50 }
51
52 void *thr_writer(void *arg)
53 {
54 int i;
55 struct test_array *new, *old;
56
57 printf("thread %s, thread id : %lu, pid %lu\n",
58 "writer", pthread_self(), getpid());
59 sleep(2);
60
61 for (i = 0; i < 1000; i++) {
62 rcu_write_lock();
63 new = malloc(sizeof(struct test_array));
64 old = test_rcu_pointer;
65 if (old) {
66 assert(old->a == 8);
67 assert(old->b == 12);
68 assert(old->c[55] == 2);
69 }
70 assert(new->a = 8);
71 assert(new->b = 12);
72 assert(new->c[55] = 2);
73 old = urcu_publish_content(&test_rcu_pointer, new);
74 rcu_write_unlock();
75 /* can be done after unlock */
76 free(old);
77 }
78
79 return ((void*)2);
80 }
81
82 int main()
83 {
84 int err;
85 pthread_t tid_reader[NR_READ], tid_writer[NR_WRITE];
86 void *tret;
87 int i;
88
89 for (i = 0; i < NR_READ; i++) {
90 err = pthread_create(&tid_reader[i], NULL, thr_reader, NULL);
91 if (err != 0)
92 exit(1);
93 }
94 for (i = 0; i < NR_WRITE; i++) {
95 err = pthread_create(&tid_writer[i], NULL, thr_writer, NULL);
96 if (err != 0)
97 exit(1);
98 }
99
100 sleep(10);
101
102 for (i = 0; i < NR_WRITE; i++) {
103 err = pthread_join(tid_reader[i], &tret);
104 if (err != 0)
105 exit(1);
106 }
107 for (i = 0; i < NR_WRITE; i++) {
108 err = pthread_join(tid_writer[i], &tret);
109 if (err != 0)
110 exit(1);
111 }
112
113 return 0;
114 }
This page took 0.031936 seconds and 5 git commands to generate.