runs
[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
20#define NR_READ 1000
21#define NR_WRITE 50
f69f195a
MD
22
23
24void *thr_reader(void *arg)
25{
41718ff9
MD
26 int qparity, i;
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
41718ff9
MD
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 }
f69f195a
MD
45
46 urcu_unregister_thread();
41718ff9 47
f69f195a
MD
48 return ((void*)1);
49
50}
51
52void *thr_writer(void *arg)
53{
54 int i;
41718ff9 55 struct test_array *new, *old;
f69f195a
MD
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++) {
41718ff9
MD
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);
f69f195a
MD
77 }
78
79 return ((void*)2);
80}
ac260fd9
MD
81
82int main()
83{
f69f195a
MD
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);
ac260fd9 101
f69f195a
MD
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 }
ac260fd9 112
f69f195a 113 return 0;
ac260fd9 114}
This page took 0.026368 seconds and 4 git commands to generate.