| C RCU+sync+free | 
|   | 
| (* | 
|  * Result: Never | 
|  * | 
|  * This litmus test demonstrates that an RCU reader can never see a write that | 
|  * follows a grace period, if it did not see writes that precede that grace | 
|  * period. | 
|  * | 
|  * This is a typical pattern of RCU usage, where the write before the grace | 
|  * period assigns a pointer, and the writes following the grace period destroy | 
|  * the object that the pointer used to point to. | 
|  * | 
|  * This is one implication of the RCU grace-period guarantee, which says (among | 
|  * other things) that an RCU read-side critical section cannot span a grace period. | 
|  *) | 
|   | 
| { | 
| int x = 1; | 
| int *y = &x; | 
| int z = 1; | 
| } | 
|   | 
| P0(int *x, int *z, int **y) | 
| { | 
|     int *r0; | 
|     int r1; | 
|   | 
|     rcu_read_lock(); | 
|     r0 = rcu_dereference(*y); | 
|     r1 = READ_ONCE(*r0); | 
|     rcu_read_unlock(); | 
| } | 
|   | 
| P1(int *x, int *z, int **y) | 
| { | 
|     rcu_assign_pointer(*y, z); | 
|     synchronize_rcu(); | 
|     WRITE_ONCE(*x, 0); | 
| } | 
|   | 
| exists (0:r0=x /\ 0:r1=0) |