summaryrefslogtreecommitdiff
path: root/test/tx/regression/threadx_thread_priority_change.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/tx/regression/threadx_thread_priority_change.c')
-rw-r--r--test/tx/regression/threadx_thread_priority_change.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/test/tx/regression/threadx_thread_priority_change.c b/test/tx/regression/threadx_thread_priority_change.c
index 1cb52ff9..ac750a5f 100644
--- a/test/tx/regression/threadx_thread_priority_change.c
+++ b/test/tx/regression/threadx_thread_priority_change.c
@@ -354,6 +354,15 @@ static void thread_3_entry(ULONG thread_input)
UINT old_priority;
UINT loop;
+/* The interrupt below only fires on a narrow window: thread 3 at priority 6,
+ ready, and not yet at the head of its priority list. Waiting for it without a
+ bound made this test hang indefinitely when the window was never hit, which
+ showed up in CI as a timeout carrying no information about what went wrong.
+ The TX_NOT_INTERRUPTABLE path already stopped after a fixed amount of work;
+ this gives the interruptable path the same protection. */
+UINT attempts = 0;
+#define MAX_PRIORITY_CHANGE_ATTEMPTS 100000
+
/* Resume threads 4. */
tx_thread_resume(&thread_4);
@@ -378,7 +387,23 @@ UINT loop;
if (thread_4_counter)
thread_1_counter++;
- } while (test_isr_dispatch);
+ attempts++;
+
+ } while (test_isr_dispatch && (attempts < MAX_PRIORITY_CHANGE_ATTEMPTS));
+
+ /* Stop the interrupt regardless, so a window that was never hit does not
+ leave the handler installed for the rest of the test. */
+ test_isr_dispatch = TX_NULL;
+
+ if (attempts >= MAX_PRIORITY_CHANGE_ATTEMPTS)
+ {
+
+ /* The window was not reached. That is a gap in what this test covered on
+ this run rather than a fault in the code under test, so say so instead
+ of failing, and leave the counters alone so the checks that follow
+ still mean what they did before. */
+ printf("(priority change window not reached in %u attempts) ", attempts);
+ }
}