浏览代码

fix deadlock of prio on hannibal (wake up active workers is pointless)

Andra Hugo 12 年之前
父节点
当前提交
1c0a47008a
共有 1 个文件被更改,包括 10 次插入5 次删除
  1. 10 5
      src/sched_policies/eager_central_priority_policy.c

+ 10 - 5
src/sched_policies/eager_central_priority_policy.c

@@ -185,7 +185,8 @@ static struct starpu_task *_starpu_priority_pop_task(unsigned sched_ctx_id)
 		{
 		{
 			for (task  = starpu_task_list_begin(&taskq->taskq[priolevel]);
 			for (task  = starpu_task_list_begin(&taskq->taskq[priolevel]);
 			     task != starpu_task_list_end(&taskq->taskq[priolevel]);
 			     task != starpu_task_list_end(&taskq->taskq[priolevel]);
-			     task  = starpu_task_list_next(task)) {
+			     task  = starpu_task_list_next(task)) 
+			{
 				unsigned nimpl;
 				unsigned nimpl;
 				for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++)
 				for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++)
 				{
 				{
@@ -199,7 +200,7 @@ static struct starpu_task *_starpu_priority_pop_task(unsigned sched_ctx_id)
 						taskq->total_ntasks--;
 						taskq->total_ntasks--;
 						_STARPU_TRACE_JOB_POP(task, 0);
 						_STARPU_TRACE_JOB_POP(task, 0);
 					} else skipped = 1;
 					} else skipped = 1;
-					}
+				}
 			}
 			}
 		}
 		}
 	}
 	}
@@ -225,9 +226,13 @@ static struct starpu_task *_starpu_priority_pop_task(unsigned sched_ctx_id)
 				_starpu_pthread_mutex_t *sched_mutex;
 				_starpu_pthread_mutex_t *sched_mutex;
 				_starpu_pthread_cond_t *sched_cond;
 				_starpu_pthread_cond_t *sched_cond;
 				starpu_worker_get_sched_condition(worker, &sched_mutex, &sched_cond);
 				starpu_worker_get_sched_condition(worker, &sched_mutex, &sched_cond);
-				_STARPU_PTHREAD_MUTEX_LOCK(sched_mutex);
-				_STARPU_PTHREAD_COND_SIGNAL(sched_cond);
-				_STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex);
+                               /* if the worker is busy it means that he's active & we don't have to wake him up */
+				int ret = _STARPU_PTHREAD_MUTEX_TRYLOCK(sched_mutex);
+				if(ret != EBUSY)
+				{
+					_STARPU_PTHREAD_COND_SIGNAL(sched_cond);
+					_STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex);
+				}
 			}
 			}
 		}
 		}