3 #include "libinterface.h"
15 int old_seq = load_32(&_seq);
17 if (old_seq % 2 == 1) {
19 int res = load_32(&_data);
20 int seq = load_32(&_seq);
22 if (seq == old_seq) { // relaxed
29 void seqlock_write(int new_data) {
31 int old_seq = load_32(&_seq);
32 if (old_seq % 2 == 1) {
34 int new_seq = old_seq + 1;
35 int cas_value = rmw_32(CAS, &_seq, old_seq, new_seq);
36 if (old_seq == cas_value) {
41 store_32(&_data, new_data);
43 rmw_32(ADD, &_seq, /*dummy */0, 1);
46 static void a(void *obj) {
50 static void b(void *obj) {
54 static void c(void *obj) {
55 int r1 = seqlock_read();
58 int user_main(int argc, char **argv) {
62 thrd_create(&t1, (thrd_start_t)&a, NULL);
63 thrd_create(&t2, (thrd_start_t)&b, NULL);
64 thrd_create(&t3, (thrd_start_t)&c, NULL);