diff options
author | Jakub Jelinek <jakub@redhat.com> | 2014-08-04 17:45:50 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2014-08-04 17:45:50 +0200 |
commit | 3696163cb43bdd7c3a22bef46a0e3f4576d0fc44 (patch) | |
tree | 802bd51205c193f686bd365074adad2cdcb92704 /libgomp | |
parent | c6d4f6b465566cfec138c47702727fcf5c09c7e2 (diff) | |
download | gcc-3696163cb43bdd7c3a22bef46a0e3f4576d0fc44.zip gcc-3696163cb43bdd7c3a22bef46a0e3f4576d0fc44.tar.gz gcc-3696163cb43bdd7c3a22bef46a0e3f4576d0fc44.tar.bz2 |
task.c (GOMP_taskgroup_end): If taskgroup->num_children is not zero...
* task.c (GOMP_taskgroup_end): If taskgroup->num_children
is not zero, but taskgroup->children is NULL and there are
any task->children, schedule those instead of waiting.
* testsuite/libgomp.c/depend-6.c: New test.
* testsuite/libgomp.c/depend-7.c: New test.
* testsuite/libgomp.c/depend-8.c: New test.
* testsuite/libgomp.c/depend-9.c: New test.
* testsuite/libgomp.c/depend-10.c: New test.
From-SVN: r213592
Diffstat (limited to 'libgomp')
-rw-r--r-- | libgomp/ChangeLog | 11 | ||||
-rw-r--r-- | libgomp/task.c | 38 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/depend-10.c | 3 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/depend-6.c | 3 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/depend-7.c | 3 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/depend-8.c | 3 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/depend-9.c | 3 |
7 files changed, 44 insertions, 20 deletions
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 28a7867..ee73689 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,14 @@ +2014-08-04 Jakub Jelinek <jakub@redhat.com> + + * task.c (GOMP_taskgroup_end): If taskgroup->num_children + is not zero, but taskgroup->children is NULL and there are + any task->children, schedule those instead of waiting. + * testsuite/libgomp.c/depend-6.c: New test. + * testsuite/libgomp.c/depend-7.c: New test. + * testsuite/libgomp.c/depend-8.c: New test. + * testsuite/libgomp.c/depend-9.c: New test. + * testsuite/libgomp.c/depend-10.c: New test. + 2014-08-01 Jakub Jelinek <jakub@redhat.com> * libgomp.h (struct gomp_task_depend_entry): Add redundant_out field. diff --git a/libgomp/task.c b/libgomp/task.c index 58750ea..7d3233c 100644 --- a/libgomp/task.c +++ b/libgomp/task.c @@ -1115,18 +1115,26 @@ GOMP_taskgroup_end (void) if (taskgroup->children == NULL) { if (taskgroup->num_children) - goto do_wait; - gomp_mutex_unlock (&team->task_lock); - if (to_free) { - gomp_finish_task (to_free); - free (to_free); + if (task->children == NULL) + goto do_wait; + child_task = task->children; + } + else + { + gomp_mutex_unlock (&team->task_lock); + if (to_free) + { + gomp_finish_task (to_free); + free (to_free); + } + goto finish; } - goto finish; } - if (taskgroup->children->kind == GOMP_TASK_WAITING) + else + child_task = taskgroup->children; + if (child_task->kind == GOMP_TASK_WAITING) { - child_task = taskgroup->children; cancelled = gomp_task_run_pre (child_task, child_task->parent, taskgroup, team); @@ -1143,6 +1151,7 @@ GOMP_taskgroup_end (void) } else { + child_task = NULL; do_wait: /* All tasks we are waiting for are already running in other threads. Wait for them. */ @@ -1174,20 +1183,9 @@ GOMP_taskgroup_end (void) finish_cancelled:; size_t new_tasks = gomp_task_run_post_handle_depend (child_task, team); - child_task->prev_taskgroup->next_taskgroup - = child_task->next_taskgroup; - child_task->next_taskgroup->prev_taskgroup - = child_task->prev_taskgroup; - --taskgroup->num_children; - if (taskgroup->children == child_task) - { - if (child_task->next_taskgroup != child_task) - taskgroup->children = child_task->next_taskgroup; - else - taskgroup->children = NULL; - } gomp_task_run_post_remove_parent (child_task); gomp_clear_parent (child_task->children); + gomp_task_run_post_remove_taskgroup (child_task); to_free = child_task; child_task = NULL; team->task_count--; diff --git a/libgomp/testsuite/libgomp.c/depend-10.c b/libgomp/testsuite/libgomp.c/depend-10.c new file mode 100644 index 0000000..2137bf9 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/depend-10.c @@ -0,0 +1,3 @@ +/* { dg-set-target-env-var OMP_NUM_THREADS "1" } */ + +#include "depend-5.c" diff --git a/libgomp/testsuite/libgomp.c/depend-6.c b/libgomp/testsuite/libgomp.c/depend-6.c new file mode 100644 index 0000000..d30e6e9 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/depend-6.c @@ -0,0 +1,3 @@ +/* { dg-set-target-env-var OMP_NUM_THREADS "1" } */ + +#include "depend-1.c" diff --git a/libgomp/testsuite/libgomp.c/depend-7.c b/libgomp/testsuite/libgomp.c/depend-7.c new file mode 100644 index 0000000..bd4a3f9 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/depend-7.c @@ -0,0 +1,3 @@ +/* { dg-set-target-env-var OMP_NUM_THREADS "1" } */ + +#include "depend-2.c" diff --git a/libgomp/testsuite/libgomp.c/depend-8.c b/libgomp/testsuite/libgomp.c/depend-8.c new file mode 100644 index 0000000..4dcce67 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/depend-8.c @@ -0,0 +1,3 @@ +/* { dg-set-target-env-var OMP_NUM_THREADS "1" } */ + +#include "depend-3.c" diff --git a/libgomp/testsuite/libgomp.c/depend-9.c b/libgomp/testsuite/libgomp.c/depend-9.c new file mode 100644 index 0000000..a52c47a --- /dev/null +++ b/libgomp/testsuite/libgomp.c/depend-9.c @@ -0,0 +1,3 @@ +/* { dg-set-target-env-var OMP_NUM_THREADS "1" } */ + +#include "depend-4.c" |