summaryrefslogtreecommitdiffstatshomepage
path: root/tests/thread/mutate_instance.py
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2016-05-17 15:27:30 +0000
committerDamien George <damien.p.george@gmail.com>2016-06-28 11:28:50 +0100
commitb7274e91bc2fe6a8059ce7e65e02c20d000322b1 (patch)
tree1333409e189aff047822ab9783ae5181552af413 /tests/thread/mutate_instance.py
parent2e4cdae4fd866149185a5c16a7e0e37b9b87150c (diff)
downloadmicropython-b7274e91bc2fe6a8059ce7e65e02c20d000322b1.tar.gz
micropython-b7274e91bc2fe6a8059ce7e65e02c20d000322b1.zip
tests/thread: Add test for concurrent mutating of user instance.
Diffstat (limited to 'tests/thread/mutate_instance.py')
-rw-r--r--tests/thread/mutate_instance.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/tests/thread/mutate_instance.py b/tests/thread/mutate_instance.py
new file mode 100644
index 0000000000..449c9f0e0c
--- /dev/null
+++ b/tests/thread/mutate_instance.py
@@ -0,0 +1,43 @@
+# test concurrent mutating access to a shared user instance
+#
+# MIT license; Copyright (c) 2016 Damien P. George on behalf of Pycom Ltd
+
+import _thread
+
+# the shared user class and instance
+class User:
+ def __init__(self):
+ self.a = 'A'
+ self.b = 'B'
+ self.c = 'C'
+user = User()
+
+# main thread function
+def th(n, lo, hi):
+ for repeat in range(n):
+ for i in range(lo, hi):
+ setattr(user, 'attr_%u' % i, repeat + i)
+ assert getattr(user, 'attr_%u' % i) == repeat + i
+
+ with lock:
+ global n_finished
+ n_finished += 1
+
+lock = _thread.allocate_lock()
+n_repeat = 30
+n_range = 300
+n_thread = 4
+n_finished = 0
+
+# spawn threads
+for i in range(n_thread):
+ _thread.start_new_thread(th, (n_repeat, i * n_range, (i + 1) * n_range))
+
+# busy wait for threads to finish
+while n_finished < n_thread:
+ pass
+
+# check user instance has correct contents
+print(user.a, user.b, user.c)
+for i in range(n_thread * n_range):
+ assert getattr(user, 'attr_%u' % i) == n_repeat - 1 + i