浏览代码

Check task status value before setting it

Samuel Thibault 6 年之前
父节点
当前提交
1acc294ed4

+ 1 - 0
src/core/dependencies/data_concurrency.c

@@ -280,6 +280,7 @@ static unsigned _submit_job_enforce_data_deps(struct _starpu_job *j, unsigned st
 				continue;
 		}
 
+                STARPU_ASSERT(j->task->status == STARPU_TASK_BLOCKED || j->task->status == STARPU_TASK_BLOCKED_ON_TAG || j->task->status == STARPU_TASK_BLOCKED_ON_TASK || j->task->status == STARPU_TASK_BLOCKED_ON_DATA);
                 j->task->status = STARPU_TASK_BLOCKED_ON_DATA;
 
 		if(handle->arbiter)

+ 3 - 0
src/core/jobs.c

@@ -300,6 +300,7 @@ void _starpu_handle_job_termination(struct _starpu_job *j)
 #endif
 
 	STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex);
+	STARPU_ASSERT(task->status == STARPU_TASK_RUNNING);
 #ifdef STARPU_OPENMP
 	if (continuation)
 	{
@@ -514,6 +515,7 @@ void _starpu_handle_job_termination(struct _starpu_job *j)
 #endif
 			{
 				/* We reuse the same job structure */
+				task->status = STARPU_TASK_BLOCKED;
 				int ret = _starpu_submit_job(j);
 				STARPU_ASSERT(!ret);
 			}
@@ -593,6 +595,7 @@ static unsigned _starpu_not_all_task_deps_are_fulfilled(struct _starpu_job *j)
 
 	if (!j->submitted || (job_successors->ndeps != job_successors->ndeps_completed))
 	{
+		STARPU_ASSERT(j->task->status == STARPU_TASK_BLOCKED || j->task->status == STARPU_TASK_BLOCKED_ON_TAG);
                 j->task->status = STARPU_TASK_BLOCKED_ON_TASK;
 		ret = 1;
 	}

+ 2 - 0
src/core/sched_policy.c

@@ -422,6 +422,7 @@ int _starpu_repush_task(struct _starpu_job *j)
 	_STARPU_LOG_IN();
 
 	unsigned can_push = _starpu_increment_nready_tasks_of_sched_ctx(task->sched_ctx, task->flops, task);
+	STARPU_ASSERT(task->status == STARPU_TASK_BLOCKED || task->status == STARPU_TASK_BLOCKED_ON_TAG || task->status == STARPU_TASK_BLOCKED_ON_TASK || task->status == STARPU_TASK_BLOCKED_ON_DATA);
 	task->status = STARPU_TASK_READY;
 	STARPU_AYU_ADDTOTASKQUEUE(j->job_id, -1);
 	/* if the context does not have any workers save the tasks in a temp list */
@@ -457,6 +458,7 @@ int _starpu_repush_task(struct _starpu_job *j)
 	 * corresponding dependencies */
 	if (task->cl == NULL || task->where == STARPU_NOWHERE)
 	{
+		task->status = STARPU_TASK_RUNNING;
 		if (task->prologue_callback_pop_func)
 			task->prologue_callback_pop_func(task->prologue_callback_pop_arg);
 

+ 7 - 0
src/core/task.c

@@ -540,6 +540,11 @@ static int _starpu_task_submit_head(struct starpu_task *task)
 	unsigned is_sync = task->synchronous;
 	struct _starpu_job *j = _starpu_get_job_associated_to_task(task);
 
+	if (task->status == STARPU_TASK_FINISHED)
+		task->status = STARPU_TASK_INVALID;
+	else
+		STARPU_ASSERT(task->status == STARPU_TASK_INVALID);
+
 	if (j->internal)
 	{
 		// Internal tasks are submitted to initial context
@@ -782,6 +787,7 @@ int _starpu_task_submit_nodeps(struct starpu_task *task)
 	if (task->cl)
 		/* This would be done by data dependencies checking */
 		_starpu_job_set_ordered_buffers(j);
+	STARPU_ASSERT(task->status == STARPU_TASK_BLOCKED);
 	task->status = STARPU_TASK_READY;
 	STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex);
 
@@ -822,6 +828,7 @@ int _starpu_task_submit_conversion_task(struct starpu_task *task,
 	_starpu_increment_nready_tasks_of_sched_ctx(j->task->sched_ctx, j->task->flops, j->task);
 	_starpu_job_set_ordered_buffers(j);
 
+	STARPU_ASSERT(task->status == STARPU_TASK_BLOCKED);
 	task->status = STARPU_TASK_READY;
 	_starpu_profiling_set_task_push_start_time(task);
 

+ 3 - 1
src/drivers/driver_common/driver_common.c

@@ -53,10 +53,12 @@ void _starpu_driver_start_job(struct _starpu_worker *worker, struct _starpu_job
 		_starpu_sched_pre_exec_hook(task);
 
 	_starpu_set_worker_status(worker, STATUS_EXECUTING);
-	task->status = STARPU_TASK_RUNNING;
 
 	if (rank == 0)
 	{
+		STARPU_ASSERT(task->status == STARPU_TASK_READY);
+		task->status = STARPU_TASK_RUNNING;
+
 		STARPU_AYU_RUNTASK(j->job_id);
 		cl->per_worker_stats[workerid]++;