diff options
author | Alan Modra <amodra@gmail.com> | 2013-02-01 23:22:41 +1030 |
---|---|---|
committer | Alan Modra <amodra@gcc.gnu.org> | 2013-02-01 23:22:41 +1030 |
commit | bed8d8a6922900f3b92652f5b21ba01b583b2b1d (patch) | |
tree | e3c309016d5ae2d12e311b052c30ce5eb676d54c /libgomp/task.c | |
parent | 8c7ca45c9d2641477ceebf30568af8d4c49ff2f9 (diff) | |
download | gcc-bed8d8a6922900f3b92652f5b21ba01b583b2b1d.zip gcc-bed8d8a6922900f3b92652f5b21ba01b583b2b1d.tar.gz gcc-bed8d8a6922900f3b92652f5b21ba01b583b2b1d.tar.bz2 |
task.c (GOMP_task, [...]): Comment.
* task.c (GOMP_task, GOMP_taskwait): Comment.
From-SVN: r195647
Diffstat (limited to 'libgomp/task.c')
-rw-r--r-- | libgomp/task.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/libgomp/task.c b/libgomp/task.c index 937f266..7de650a 100644 --- a/libgomp/task.c +++ b/libgomp/task.c @@ -116,6 +116,15 @@ GOMP_task (void (*fn) (void *), void *data, void (*cpyfn) (void *, void *), } else fn (data); + /* Access to "children" is normally done inside a task_lock + mutex region, but the only way this particular task.children + can be set is if this thread's task work function (fn) + creates children. So since the setter is *this* thread, we + need no barriers here when testing for non-NULL. We can have + task.children set by the current thread then changed by a + child thread, but seeing a stale non-NULL value is not a + problem. Once past the task_lock acquisition, this thread + will see the real value of task.children. */ if (task.children != NULL) { gomp_mutex_lock (&team->task_lock); @@ -296,6 +305,12 @@ GOMP_taskwait (void) struct gomp_task *child_task = NULL; struct gomp_task *to_free = NULL; + /* The acquire barrier on load of task->children here synchronizes + with the write of a NULL in gomp_barrier_handle_tasks. It is + not necessary that we synchronize with other non-NULL writes at + this point, but we must ensure that all writes to memory by a + child thread task work function are seen before we exit from + GOMP_taskwait. */ if (task == NULL || __atomic_load_n (&task->children, MEMMODEL_ACQUIRE) == NULL) return; |