123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- // { dg-do run }
- // { dg-set-target-env-var OMP_CANCELLATION "true" }
- #include <unistd.h>
- #include <omp.h>
- #include "cancel-test.h"
- static void
- foo (int *x)
- {
- S a, b, c;
- #pragma omp parallel firstprivate(x, c) num_threads (32) private (b)
- {
- S d;
- b.bump ();
- c.bump ();
- int thr = omp_get_thread_num ();
- switch (x[thr])
- {
- case 4:;
- #pragma omp cancel parallel
- break;
- case 3:
- #pragma omp task
- usleep (1000);
- #pragma omp task
- usleep (2000);
- #pragma omp task
- usleep (4000);
- break;
- case 2:
- usleep (1000);
- /* FALLTHRU */
- case 1:;
- #pragma omp cancellation point parallel
- break;
- }
- #pragma omp barrier
- if (omp_get_cancellation ())
- abort ();
- }
- }
- int
- main ()
- {
- int i, j, x[32] = { 0, 1, 2, 4, 2, 2, 1, 0 };
- foo (x);
- for (i = 0; i < 32; i++)
- {
- for (j = 0; j < 32; j++)
- x[j] = rand () & 3;
- x[rand () & 31] = 4;
- foo (x);
- }
- S::verify ();
- }
|