aboutsummaryrefslogtreecommitdiff
path: root/core/sync/sync2/sync_util.odin
blob: 013bf511a2943277e2d7e301e8bcbb8b0ba0c51f (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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package sync2

/*
Example:
	if guard(&m) {
		...
	}
*/
guard :: proc{
	mutex_guard,
	rw_mutex_guard,
	ticket_mutex_guard,
	benaphore_guard,
	recursive_benaphore_guard,
	atomic_mutex_guard,
	atomic_recursive_mutex_guard,
	atomic_rw_mutex_guard,
}
/*
Example:
	if shared_guard(&m) {
		...
	}
*/
shared_guard :: proc{
	rw_mutex_shared_guard,
	atomic_rw_mutex_shared_guard,
}

// lock locks m
lock :: proc{
	mutex_lock,
	rw_mutex_lock,
	ticket_mutex_lock,
	benaphore_lock,
	recursive_benaphore_lock,
	atomic_mutex_lock,
	atomic_recursive_mutex_lock,
	atomic_rw_mutex_lock,
}

// unlock locks m
unlock :: proc{
	mutex_unlock,
	rw_mutex_unlock,
	ticket_mutex_unlock,
	benaphore_unlock,
	recursive_benaphore_unlock,
	atomic_mutex_unlock,
	atomic_recursive_mutex_unlock,
	atomic_rw_mutex_unlock,
}

// try_lock tries to lock m, will return true on success, and false on failure
try_lock :: proc{
	mutex_try_lock,
	rw_mutex_try_lock,
	benaphore_try_lock,
	recursive_benaphore_try_lock,
	atomic_mutex_try_lock,
	atomic_recursive_mutex_try_lock,
	atomic_rw_mutex_try_lock,
}

// shared_lock locks rw for reading (with arbitrary number of readers)
shared_lock :: proc{
	rw_mutex_shared_lock,
	atomic_rw_mutex_shared_lock,
}

// shared_unlock unlocks rw for reading (with arbitrary number of readers)
shared_unlock :: proc{
	rw_mutex_shared_unlock,
	atomic_rw_mutex_shared_unlock,
}

// try_shared_lock tries to lock rw for reading (with arbitrary number of readers)
try_shared_lock :: proc{
	rw_mutex_try_shared_lock,
	atomic_rw_mutex_try_shared_lock,
}



wait :: proc{
	cond_wait,
	sema_wait,
	atomic_cond_wait,
	atomic_sema_wait,
	futex_wait,
}

wait_with_timeout :: proc{
	cond_wait_with_timeout,
	sema_wait_with_timeout,
	atomic_cond_wait_with_timeout,
	atomic_sema_wait_with_timeout,
	futex_wait_with_timeout,
}

post :: proc{
	sema_post,
	atomic_sema_post,
}

signal :: proc{
	cond_signal,
	atomic_cond_signal,
	futex_signal,
}

broadcast :: proc{
	cond_broadcast,
	atomic_cond_broadcast,
	futex_broadcast,
}