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