aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/v/tests/shared_lock_test.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/vlib/v/tests/shared_lock_test.v')
-rw-r--r--v_windows/v/vlib/v/tests/shared_lock_test.v77
1 files changed, 77 insertions, 0 deletions
diff --git a/v_windows/v/vlib/v/tests/shared_lock_test.v b/v_windows/v/vlib/v/tests/shared_lock_test.v
new file mode 100644
index 0000000..c9de4a4
--- /dev/null
+++ b/v_windows/v/vlib/v/tests/shared_lock_test.v
@@ -0,0 +1,77 @@
+import time
+
+struct St {
+mut:
+ a int
+}
+
+fn f(shared x St, shared y St, shared z St) {
+ for _ in 0 .. 101 {
+ lock x, y {
+ tmp := y.a
+ y.a = x.a
+ x.a = tmp
+ }
+ }
+ lock z {
+ z.a--
+ }
+}
+
+fn test_shared_lock() {
+ shared x := St{
+ a: 5
+ }
+ shared y := &St{
+ a: 7
+ }
+ shared z := St{
+ a: 1
+ }
+ go f(shared x, shared y, shared z)
+ for _ in 0 .. 100 {
+ lock x, y {
+ tmp := x.a
+ x.a = y.a
+ y.a = tmp
+ }
+ }
+ // the following would be a good application for a channel
+ for finished := false; true; {
+ rlock z {
+ finished = z.a == 0
+ }
+ if finished {
+ break
+ }
+ time.sleep(100 * time.millisecond)
+ }
+ rlock x, y {
+ assert x.a == 7 && y.a == 5
+ }
+}
+
+struct App {
+ id string = 'test'
+mut:
+ app_data shared AppData
+}
+
+fn (mut a App) init_server_direct() {
+ lock a.app_data {
+ // a.app_data = AppData{}
+ }
+}
+
+struct AppData {
+ id string = 'foo'
+}
+
+fn test_shared_field_init() {
+ mut app1 := App{}
+ app1.init_server_direct()
+ id := rlock app1.app_data {
+ app1.app_data.id
+ }
+ // assert id == 'foo'
+}