Explorar el Código

properly test for task termination

Samuel Thibault hace 11 años
padre
commit
804e6f8233
Se han modificado 5 ficheros con 22 adiciones y 2 borrados
  1. 2 0
      include/starpu_task.h
  2. 9 0
      src/core/jobs.c
  3. 3 0
      src/core/jobs.h
  4. 7 0
      src/core/task.c
  5. 1 2
      tests/main/driver_api/init_run_deinit.c

+ 2 - 0
include/starpu_task.h

@@ -234,6 +234,8 @@ void starpu_task_destroy(struct starpu_task *task);
 int starpu_task_submit(struct starpu_task *task) STARPU_WARN_UNUSED_RESULT;
 int starpu_task_submit_to_ctx(struct starpu_task *task, unsigned sched_ctx_id);
 
+int starpu_task_finished(struct starpu_task *task) STARPU_WARN_UNUSED_RESULT;
+
 int starpu_task_wait(struct starpu_task *task) STARPU_WARN_UNUSED_RESULT;
 
 int starpu_task_wait_for_all(void);

+ 9 - 0
src/core/jobs.c

@@ -116,6 +116,15 @@ void _starpu_job_destroy(struct _starpu_job *j)
 	_starpu_job_delete(j);
 }
 
+int _starpu_job_finished(struct _starpu_job *j)
+{
+	int ret;
+	STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex);
+	ret = j->terminated == 2;
+	STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex);
+	return ret;
+}
+
 void _starpu_wait_job(struct _starpu_job *j)
 {
 	STARPU_ASSERT(j->task);

+ 3 - 0
src/core/jobs.h

@@ -146,6 +146,9 @@ struct _starpu_job* STARPU_ATTRIBUTE_MALLOC _starpu_job_create(struct starpu_tas
 /* Destroy the data structure associated to the job structure */
 void _starpu_job_destroy(struct _starpu_job *j);
 
+/* Test for the termination of the job */
+int _starpu_job_finished(struct _starpu_job *j);
+
 /* Wait for the termination of the job */
 void _starpu_wait_job(struct _starpu_job *j);
 

+ 7 - 0
src/core/task.c

@@ -183,6 +183,13 @@ void starpu_task_destroy(struct starpu_task *task)
 	_starpu_task_destroy(task);
 }
 
+int starpu_task_finished(struct starpu_task *task)
+{
+	STARPU_ASSERT(task);
+	STARPU_ASSERT_MSG(!task->detach, "starpu_task_finished can only be called on tasks with detach = 0");
+	return _starpu_job_finished(_starpu_get_job_associated_to_task(task));
+}
+
 int starpu_task_wait(struct starpu_task *task)
 {
         _STARPU_LOG_IN();

+ 1 - 2
tests/main/driver_api/init_run_deinit.c

@@ -49,8 +49,7 @@ run(struct starpu_task *task, struct starpu_driver *d)
 	int ret;
 	ret = starpu_task_submit(task);
 	STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
-	int i;
-	for (i = 0; i < NTASKS; i++)
+	while (!starpu_task_finished(task))
 	{
 		ret = starpu_driver_run_once(d);
 		STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_run_once");