Переглянути джерело

Bug fix: while submitting a task, it was possible that all its dependencies
were fulfilled. In some situation this could result in trying finish the
submission of a task that was actually already destroyed.

Cédric Augonnet 14 роки тому
батько
коміт
3132f14bf2
3 змінених файлів з 14 додано та 2 видалено
  1. 5 1
      src/core/dependencies/tags.c
  2. 3 0
      src/core/jobs.c
  3. 6 1
      src/core/task.c

+ 5 - 1
src/core/dependencies/tags.c

@@ -154,8 +154,12 @@ void _starpu_tag_set_ready(struct starpu_tag_s *tag)
 	 * lock again, resulting in a deadlock. */
 	_starpu_spin_unlock(&tag->lock);
 
+	PTHREAD_MUTEX_LOCK(&j->sync_mutex);
+
 	/* enforce data dependencies */
-	_starpu_enforce_deps_starting_from_task(j, 0);
+	_starpu_enforce_deps_starting_from_task(j, 1);
+
+	PTHREAD_MUTEX_UNLOCK(&j->sync_mutex);
 
 	_starpu_spin_lock(&tag->lock);
 }

+ 3 - 0
src/core/jobs.c

@@ -268,6 +268,7 @@ static unsigned _starpu_not_all_tag_deps_are_fulfilled(starpu_job_t j)
 	return ret;
 }
 
+#warning TODO remove the job_is_already_locked parameter
 static unsigned _starpu_not_all_task_deps_are_fulfilled(starpu_job_t j, unsigned job_is_already_locked)
 {
 	unsigned ret;
@@ -301,6 +302,7 @@ static unsigned _starpu_not_all_task_deps_are_fulfilled(starpu_job_t j, unsigned
  *	In order, we enforce tag, task and data dependencies. The task is
  *	passed to the scheduler only once all these constraints are fulfilled.
  */
+#warning TODO remove the job_is_already_locked parameter
 unsigned _starpu_enforce_deps_and_schedule(starpu_job_t j, unsigned job_is_already_locked)
 {
 	unsigned ret;
@@ -331,6 +333,7 @@ unsigned _starpu_enforce_deps_and_schedule(starpu_job_t j, unsigned job_is_alrea
 }
 
 /* Tag deps are already fulfilled */
+#warning TODO remove the job_is_already_locked parameter
 unsigned _starpu_enforce_deps_starting_from_task(starpu_job_t j, unsigned job_is_already_locked)
 {
 	unsigned ret;

+ 6 - 1
src/core/task.c

@@ -182,9 +182,14 @@ int _starpu_submit_job(starpu_job_t j, unsigned do_not_increment_nsubmitted)
 	if (!do_not_increment_nsubmitted)
 		_starpu_increment_nsubmitted_tasks();
 
+	PTHREAD_MUTEX_LOCK(&j->sync_mutex);
+	
 	j->submitted = 1;
 
-	int ret = _starpu_enforce_deps_and_schedule(j, 0);
+	int ret = _starpu_enforce_deps_and_schedule(j, 1);
+
+	PTHREAD_MUTEX_UNLOCK(&j->sync_mutex);
+
         _STARPU_LOG_OUT();
         return ret;
 }