diff --git a/openmp/runtime/src/kmp_tasking.cpp b/openmp/runtime/src/kmp_tasking.cpp --- a/openmp/runtime/src/kmp_tasking.cpp +++ b/openmp/runtime/src/kmp_tasking.cpp @@ -3048,6 +3048,7 @@ if (__kmp_atomic_compare_store(&task_team->tt.tt_num_task_pri, ntasks, ntasks - 1)) break; + ntasks = task_team->tt.tt_num_task_pri; } while (ntasks > 0); if (ntasks == 0) { KA_TRACE(20, ("__kmp_get_priority_task(exit #2): T#%d No tasks to get\n", diff --git a/openmp/runtime/test/tasking/omp_task_priority3.c b/openmp/runtime/test/tasking/omp_task_priority3.c new file mode 100644 --- /dev/null +++ b/openmp/runtime/test/tasking/omp_task_priority3.c @@ -0,0 +1,33 @@ +// RUN: %libomp-compile && env OMP_MAX_TASK_PRIORITY=42 %libomp-run + +#include +#include +#include + +int a = 0; + +int main(void) { + int i; + int max_task_priority = omp_get_max_task_priority(); + if (max_task_priority != 42) { + fprintf(stderr, + "error: omp_get_max_task_priority() returned %d instead of 42\n", + max_task_priority); + exit(EXIT_FAILURE); + } + + for (i = 0; i < 250; ++i) { + #pragma omp parallel + { + #pragma omp task priority(42) + { + #pragma omp atomic + a++; + } + } + } + + printf("a = %d\n", a); + + return EXIT_SUCCESS; +}