56 lines
		
	
	
		
			886 B
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			886 B
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| C DCL-fixed
 | |
| 
 | |
| (*
 | |
|  * Result: Never
 | |
|  *
 | |
|  * This litmus test demonstrates that double-checked locking can be
 | |
|  * reliable given proper use of smp_load_acquire() and smp_store_release()
 | |
|  * in addition to the locking.
 | |
|  *)
 | |
| 
 | |
| {
 | |
| 	int flag;
 | |
| 	int data;
 | |
| }
 | |
| 
 | |
| P0(int *flag, int *data, spinlock_t *lck)
 | |
| {
 | |
| 	int r0;
 | |
| 	int r1;
 | |
| 	int r2;
 | |
| 
 | |
| 	r0 = smp_load_acquire(flag);
 | |
| 	if (r0 == 0) {
 | |
| 		spin_lock(lck);
 | |
| 		r1 = READ_ONCE(*flag);
 | |
| 		if (r1 == 0) {
 | |
| 			WRITE_ONCE(*data, 1);
 | |
| 			smp_store_release(flag, 1);
 | |
| 		}
 | |
| 		spin_unlock(lck);
 | |
| 	}
 | |
| 	r2 = READ_ONCE(*data);
 | |
| }
 | |
| 
 | |
| P1(int *flag, int *data, spinlock_t *lck)
 | |
| {
 | |
| 	int r0;
 | |
| 	int r1;
 | |
| 	int r2;
 | |
| 
 | |
| 	r0 = smp_load_acquire(flag);
 | |
| 	if (r0 == 0) {
 | |
| 		spin_lock(lck);
 | |
| 		r1 = READ_ONCE(*flag);
 | |
| 		if (r1 == 0) {
 | |
| 			WRITE_ONCE(*data, 1);
 | |
| 			smp_store_release(flag, 1);
 | |
| 		}
 | |
| 		spin_unlock(lck);
 | |
| 	}
 | |
| 	r2 = READ_ONCE(*data);
 | |
| }
 | |
| 
 | |
| locations [flag;data;0:r0;0:r1;1:r0;1:r1]
 | |
| exists (0:r2=0 \/ 1:r2=0)
 |