aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/old/vlib/v/fmt/tests/shared_input.vv
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/old/vlib/v/fmt/tests/shared_input.vv')
-rw-r--r--v_windows/v/old/vlib/v/fmt/tests/shared_input.vv84
1 files changed, 84 insertions, 0 deletions
diff --git a/v_windows/v/old/vlib/v/fmt/tests/shared_input.vv b/v_windows/v/old/vlib/v/fmt/tests/shared_input.vv
new file mode 100644
index 0000000..dccb34a
--- /dev/null
+++ b/v_windows/v/old/vlib/v/fmt/tests/shared_input.vv
@@ -0,0 +1,84 @@
+import sync
+import time
+
+struct St {
+mut:
+ a int
+}
+
+fn (shared x St) f(shared z St) {
+ for _ in 0 .. reads_per_thread {
+ rlock x { // other instances may read at the same time
+ time.sleep(time.millisecond)
+ assert x.a == 7 || x.a == 5
+ }
+ }
+ lock z {
+ z.a--
+ }
+}
+
+fn g() shared St {
+shared x := St{a: 12 }
+ return x
+}
+
+fn h() ?shared St {
+ return error('no value')
+}
+
+fn k() {
+ shared x := g()
+ shared y := h() or {
+ shared f := St{}
+ f
+ }
+ shared z := h() ?
+ shared p := v
+ v := rlock z { z.a }
+ rlock x; lock y, z; rlock p {
+ z.a = x.a + y.a
+ }
+ println(v)
+}
+
+const (
+ reads_per_thread = 30
+ read_threads = 10
+ writes = 5
+)
+
+fn test_shared_lock() {
+ // object with separate read/write lock
+shared x := &St {
+a: 5
+}
+ shared z :=
+&St{
+ a: read_threads
+ }
+ for _ in 0.. read_threads {
+ go x.f(shared z)
+ }
+ for i in 0..writes {
+ lock x { // wait for ongoing reads to finish, don't start new ones
+ x.a = 17 // this value should never be read
+ time.sleep(50* time.millisecond)
+ x.a = if (i & 1) == 0 {
+7} else {5}
+ } // now new reads are possible again
+time.sleep(20*time.millisecond)
+ }
+ // wait until all read threads are finished
+for finished:=false;; {
+ mut rr := 0
+ rlock z {
+ rr = z.a
+ finished = z.a == 0
+}
+if finished {
+ break
+ }
+ time.sleep(100*time.millisecond)
+ }
+}