Home | History | Annotate | Download | only in store_buffering
      1 #include <src/combined_source.c>
      2 
      3 int x;
      4 int y;
      5 
      6 int __unbuffered_tpr_x;
      7 int __unbuffered_tpr_y;
      8 
      9 DEFINE_SRCU(ss);
     10 
     11 void rcu_reader(void)
     12 {
     13 	int idx;
     14 
     15 #ifndef FORCE_FAILURE_3
     16 	idx = srcu_read_lock(&ss);
     17 #endif
     18 	might_sleep();
     19 
     20 	__unbuffered_tpr_y = READ_ONCE(y);
     21 #ifdef FORCE_FAILURE
     22 	srcu_read_unlock(&ss, idx);
     23 	idx = srcu_read_lock(&ss);
     24 #endif
     25 	WRITE_ONCE(x, 1);
     26 
     27 #ifndef FORCE_FAILURE_3
     28 	srcu_read_unlock(&ss, idx);
     29 #endif
     30 	might_sleep();
     31 }
     32 
     33 void *thread_update(void *arg)
     34 {
     35 	WRITE_ONCE(y, 1);
     36 #ifndef FORCE_FAILURE_2
     37 	synchronize_srcu(&ss);
     38 #endif
     39 	might_sleep();
     40 	__unbuffered_tpr_x = READ_ONCE(x);
     41 
     42 	return NULL;
     43 }
     44 
     45 void *thread_process_reader(void *arg)
     46 {
     47 	rcu_reader();
     48 
     49 	return NULL;
     50 }
     51 
     52 int main(int argc, char *argv[])
     53 {
     54 	pthread_t tu;
     55 	pthread_t tpr;
     56 
     57 	if (pthread_create(&tu, NULL, thread_update, NULL))
     58 		abort();
     59 	if (pthread_create(&tpr, NULL, thread_process_reader, NULL))
     60 		abort();
     61 	if (pthread_join(tu, NULL))
     62 		abort();
     63 	if (pthread_join(tpr, NULL))
     64 		abort();
     65 	assert(__unbuffered_tpr_y != 0 || __unbuffered_tpr_x != 0);
     66 
     67 #ifdef ASSERT_END
     68 	assert(0);
     69 #endif
     70 
     71 	return 0;
     72 }
     73