42 lines
		
	
	
		
			680 B
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			680 B
		
	
	
	
		
			V
		
	
	
module sync
 | 
						|
 | 
						|
import time
 | 
						|
 | 
						|
fn test_waitgroup_reuse() {
 | 
						|
	mut wg := new_waitgroup()
 | 
						|
 | 
						|
	wg.add(1)
 | 
						|
	wg.done()
 | 
						|
 | 
						|
	wg.add(1)
 | 
						|
	mut executed := false
 | 
						|
	go fn (mut wg WaitGroup, executed voidptr) {
 | 
						|
		defer {
 | 
						|
			wg.done()
 | 
						|
		}
 | 
						|
		unsafe {
 | 
						|
			*(&bool(executed)) = true
 | 
						|
		}
 | 
						|
		time.sleep(100 * time.millisecond)
 | 
						|
		assert wg.wait_count == 1
 | 
						|
	}(mut wg, voidptr(&executed))
 | 
						|
 | 
						|
	wg.wait()
 | 
						|
	assert executed
 | 
						|
	assert wg.wait_count == 0
 | 
						|
}
 | 
						|
 | 
						|
fn test_waitgroup_no_use() {
 | 
						|
	mut done := false
 | 
						|
	go fn (done voidptr) {
 | 
						|
		time.sleep(1 * time.second)
 | 
						|
		if *(&bool(done)) == false {
 | 
						|
			panic('test_waitgroup_no_use did not complete in time')
 | 
						|
		}
 | 
						|
	}(voidptr(&done))
 | 
						|
 | 
						|
	mut wg := new_waitgroup()
 | 
						|
	wg.wait()
 | 
						|
	done = true
 | 
						|
}
 |