summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/thread/disable_irq.py51
-rw-r--r--tests/thread/disable_irq.py.exp2
2 files changed, 53 insertions, 0 deletions
diff --git a/tests/thread/disable_irq.py b/tests/thread/disable_irq.py
new file mode 100644
index 000000000..3f1ac74f3
--- /dev/null
+++ b/tests/thread/disable_irq.py
@@ -0,0 +1,51 @@
+# Ensure that disabling IRQs creates mutual exclusion between threads
+# (also tests nesting of disable_irq across threads)
+import machine
+import time
+import _thread
+
+if not hasattr(machine, "disable_irq"):
+ print("SKIP")
+ raise SystemExit
+
+count = 0
+thread_done = False
+
+
+def inc_count():
+ global count
+ a = machine.disable_irq()
+ try:
+ count += 1
+ i = 0
+ while i < 20:
+ b = machine.disable_irq()
+ try:
+ count += 1
+ count -= 1
+ i += 1
+ finally:
+ machine.enable_irq(b)
+ finally:
+ machine.enable_irq(a)
+
+
+def inc_count_multiple(times):
+ for _ in range(times):
+ inc_count()
+
+
+def thread_entry(inc_times):
+ global thread_done
+ inc_count_multiple(inc_times)
+ thread_done = True
+
+
+_thread.start_new_thread(thread_entry, (1000,))
+inc_count_multiple(1000)
+
+time.sleep(1)
+
+print("count", count, thread_done)
+if count == 2000:
+ print("PASS")
diff --git a/tests/thread/disable_irq.py.exp b/tests/thread/disable_irq.py.exp
new file mode 100644
index 000000000..2174b91d0
--- /dev/null
+++ b/tests/thread/disable_irq.py.exp
@@ -0,0 +1,2 @@
+count 2000 True
+PASS