aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/v/tests/break_in_lock_test.v
blob: d2048deb52e5989e70d7a3ae10d9571a8e761c0b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import time

struct AA {
mut:
	b string
}

const (
	run_time   = time.millisecond * 500 // must be big enough to ensure threads have started
	sleep_time = time.millisecond * 2000 // some tolerance added
)

fn test_return_lock() {
	start := time.now()
	shared s := AA{'3'}
	go printer(shared s, start)
	go fn (shared s AA, start time.Time) {
		for {
			reader(shared s)
			if time.now() - start > run_time {
				eprintln('> ${@FN} exited')
				exit(0)
			}
		}
	}(shared s, start)
	time.sleep(sleep_time)
	assert false
}

fn printer(shared s AA, start time.Time) {
	for {
		lock s {
			assert s.b in ['0', '1', '2', '3', '4', '5']
		}
		if time.now() - start > run_time {
			eprintln('> ${@FN} exited')
			exit(0)
		}
	}
}

fn reader(shared s AA) {
	mut i := 0
	for {
		i++
		x := i.str()
		lock s {
			s.b = x
			if s.b == '5' {
				// this test checks if cgen unlocks the mutex here
				break
			}
		}
	}
}