aboutsummaryrefslogtreecommitdiff
path: root/final/runtime/test/worksharing/single/omp_single_nowait.c
diff options
context:
space:
mode:
Diffstat (limited to 'final/runtime/test/worksharing/single/omp_single_nowait.c')
-rw-r--r--final/runtime/test/worksharing/single/omp_single_nowait.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/final/runtime/test/worksharing/single/omp_single_nowait.c b/final/runtime/test/worksharing/single/omp_single_nowait.c
new file mode 100644
index 0000000..22f8930
--- /dev/null
+++ b/final/runtime/test/worksharing/single/omp_single_nowait.c
@@ -0,0 +1,73 @@
+// RUN: %libomp-compile-and-run
+#include <stdio.h>
+#include "omp_testsuite.h"
+
+/*
+ * This test will hang if the nowait is not working properly
+ *
+ * It relies on a one thread skipping to the last single construct to
+ * release the threads in the first three single constructs
+ */
+volatile int release;
+volatile int count;
+
+void wait_for_release_then_increment(int rank)
+{
+ fprintf(stderr, "Thread nr %d enters first section"
+ " and waits.\n", rank);
+ while (release == 0);
+ #pragma omp atomic
+ count++;
+}
+
+void release_and_increment(int rank)
+{
+ fprintf(stderr, "Thread nr %d sets release to 1\n", rank);
+ release = 1;
+ #pragma omp atomic
+ count++;
+}
+
+int test_omp_single_nowait()
+{
+ release = 0;
+ count = 0;
+
+ #pragma omp parallel num_threads(4)
+ {
+ int rank;
+ rank = omp_get_thread_num ();
+ #pragma omp single nowait
+ {
+ wait_for_release_then_increment(rank);
+ }
+ #pragma omp single nowait
+ {
+ wait_for_release_then_increment(rank);
+ }
+ #pragma omp single nowait
+ {
+ wait_for_release_then_increment(rank);
+ }
+
+ #pragma omp single
+ {
+ release_and_increment(rank);
+ }
+ }
+ // Check to make sure all four singles were executed
+ return (count==4);
+} /* end of check_single_nowait*/
+
+int main()
+{
+ int i;
+ int num_failed=0;
+
+ for(i = 0; i < REPETITIONS; i++) {
+ if(!test_omp_single_nowait()) {
+ num_failed++;
+ }
+ }
+ return num_failed;
+}