/* { dg-do run { target *-*-linux* *-*-gnu* *-*-freebsd* } } */ /* { dg-timeout 10 } */ /* Test that omp_fulfill_event works when called from an external non-OpenMP thread. */ #include #include #include #include int finished = 0; int event_pending = 0; omp_event_handle_t detach_event; void * fulfill_thread (void *) { while (!__atomic_load_n (&finished, __ATOMIC_RELAXED)) { if (__atomic_load_n (&event_pending, __ATOMIC_ACQUIRE)) { omp_fulfill_event (detach_event); __atomic_store_n (&event_pending, 0, __ATOMIC_RELEASE); } sleep(1); } return 0; } int main (void) { pthread_t thr; int dep; pthread_create (&thr, NULL, fulfill_thread, 0); #pragma omp parallel #pragma omp single { omp_event_handle_t ev; #pragma omp task depend (out: dep) detach (ev) { detach_event = ev; __atomic_store_n (&event_pending, 1, __ATOMIC_RELEASE); } #pragma omp task depend (in: dep) { __atomic_store_n (&finished, 1, __ATOMIC_RELAXED); } } pthread_join (thr, 0); return 0; }