|
@@ -616,18 +616,25 @@ void _starpu_add_post_sync_tasks(struct starpu_task *post_sync_task, starpu_data
|
|
|
_STARPU_LOG_OUT();
|
|
|
}
|
|
|
|
|
|
-void _starpu_unlock_post_sync_tasks(starpu_data_handle_t handle)
|
|
|
+void _starpu_unlock_post_sync_tasks(starpu_data_handle_t handle, enum starpu_data_access_mode mode)
|
|
|
{
|
|
|
struct _starpu_task_wrapper_list *post_sync_tasks = NULL;
|
|
|
unsigned do_submit_tasks = 0;
|
|
|
+ unsigned last_cnt;
|
|
|
|
|
|
/* Here helgrind would shout that this is an unprotected access, but
|
|
|
* count can only be zero if we don't have to care about
|
|
|
* post_sync_tasks_cnt at all. */
|
|
|
- if (STARPU_RUNNING_ON_VALGRIND || handle->post_sync_tasks_cnt)
|
|
|
+ if (handle->post_sync_tasks_cnt)
|
|
|
{
|
|
|
STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex);
|
|
|
- if (--handle->post_sync_tasks_cnt == 0)
|
|
|
+ last_cnt = handle->post_sync_tasks_cnt;
|
|
|
+
|
|
|
+ if (mode == STARPU_NONE)
|
|
|
+ /* Last release from us */
|
|
|
+ handle->post_sync_tasks_cnt--;
|
|
|
+
|
|
|
+ if (last_cnt == 1)
|
|
|
{
|
|
|
/* unlock all tasks : we need not hold the lock while unlocking all these tasks */
|
|
|
do_submit_tasks = 1;
|