Browse Source

fix dead lock & perf problem in work_stealing

Simon Archipoff 12 years ago
parent
commit
9e77d2030f
1 changed files with 6 additions and 13 deletions
  1. 6 13
      src/sched_policies/node_work_stealing.c

+ 6 - 13
src/sched_policies/node_work_stealing.c

@@ -130,19 +130,12 @@ static int push_task(struct starpu_sched_node * node, struct starpu_task * task)
 	int ret = -1;
 	int start = wsd->last_push_child;
 	int i = start;
-	do
-	{
-		i = (i+1)%node->nchilds;
-		struct starpu_sched_node * child = node->childs[i];
-		if(starpu_sched_node_can_execute_task(child,task))
-		{
-			STARPU_PTHREAD_MUTEX_LOCK(wsd->mutexes + i);
-			ret = _starpu_prio_deque_push_task(wsd->fifos + i, task);
-			STARPU_PTHREAD_MUTEX_UNLOCK(wsd->mutexes + i);
-			break;
-		}
-	}
-	while(i != start);
+	i = (i+1)%node->nchilds;
+	STARPU_PTHREAD_MUTEX_LOCK(wsd->mutexes + i);
+	ret = _starpu_prio_deque_push_task(wsd->fifos + i, task);
+	STARPU_PTHREAD_MUTEX_UNLOCK(wsd->mutexes + i);
+
+	node->available(node);
 	wsd->last_push_child = (start + 1) % node->nchilds;
 	node->childs[i]->available(node->childs[i]);
 	return ret;