diff --git a/lldb/test/API/commands/register/register/aarch64_sve_registers/rw_access_dynamic_resize/TestSVEThreadedDynamic.py b/lldb/test/API/commands/register/register/aarch64_sve_registers/rw_access_dynamic_resize/TestSVEThreadedDynamic.py --- a/lldb/test/API/commands/register/register/aarch64_sve_registers/rw_access_dynamic_resize/TestSVEThreadedDynamic.py +++ b/lldb/test/API/commands/register/register/aarch64_sve_registers/rw_access_dynamic_resize/TestSVEThreadedDynamic.py @@ -148,10 +148,6 @@ self.runCmd("process continue", RUN_SUCCEEDED) - # If we start the checks too quickly, thread 3 may not have started. - while process.GetNumThreads() < 3: - pass - for idx in range(1, process.GetNumThreads()): thread = process.GetThreadAtIndex(idx) if thread.GetStopReason() != lldb.eStopReasonBreakpoint: diff --git a/lldb/test/API/commands/register/register/aarch64_sve_registers/rw_access_dynamic_resize/main.c b/lldb/test/API/commands/register/register/aarch64_sve_registers/rw_access_dynamic_resize/main.c --- a/lldb/test/API/commands/register/register/aarch64_sve_registers/rw_access_dynamic_resize/main.c +++ b/lldb/test/API/commands/register/register/aarch64_sve_registers/rw_access_dynamic_resize/main.c @@ -1,4 +1,5 @@ #include +#include #include #ifndef PR_SME_SET_VL @@ -62,7 +63,18 @@ int SET_VL_OPT = PR_SVE_SET_VL; +// These ensure that when lldb stops in one of threadX / threadY, the other has +// at least been created. That means we can continue the other onto the expected +// breakpoint. Otherwise we could get to the breakpoint in one thread before the +// other has started. +volatile bool threadX_ready = false; +volatile bool threadY_ready = false; + void *threadX_func(void *x_arg) { + threadX_ready = true; + while (!threadY_ready) { + } + prctl(SET_VL_OPT, 8 * 4); #ifdef USE_SSVE SMSTART(); @@ -73,6 +85,10 @@ } void *threadY_func(void *y_arg) { + threadY_ready = true; + while (!threadX_ready) { + } + prctl(SET_VL_OPT, 8 * 2); #ifdef USE_SSVE SMSTART();