if (new_tasks > 0)
{
/* Wake up threads to run new tasks. */
+ gomp_team_barrier_set_task_pending (&team->barrier);
do_wake = team->nthreads - team->task_running_count;
if (do_wake > new_tasks)
do_wake = new_tasks;
--- /dev/null
+/* { 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 <omp.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <stdio.h>
+
+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;
+}