Browse Source

The local task queue (used for tasks explicitely assigned to a specific worker)
need not manipulate their own mutex. Instead, we use the same mutex/cond as
when taking a task from the scheduler.

Cédric Augonnet 14 years ago
parent
commit
f9bf60359c
3 changed files with 4 additions and 13 deletions
  1. 4 11
      src/core/jobs.c
  2. 0 1
      src/core/workers.c
  3. 0 1
      src/core/workers.h

+ 4 - 11
src/core/jobs.c

@@ -352,17 +352,14 @@ unsigned _starpu_enforce_deps_starting_from_task(starpu_job_t j, unsigned job_is
 	return ret;
 }
 
+/* This function must be called with worker->sched_mutex taken */
 struct starpu_task *_starpu_pop_local_task(struct starpu_worker_s *worker)
 {
 	struct starpu_task *task = NULL;
 
-	PTHREAD_MUTEX_LOCK(&worker->local_tasks_mutex);
-
 	if (!starpu_task_list_empty(&worker->local_tasks))
 		task = starpu_task_list_pop_back(&worker->local_tasks);
 
-	PTHREAD_MUTEX_UNLOCK(&worker->local_tasks_mutex);
-
 	return task;
 }
 
@@ -373,14 +370,10 @@ int _starpu_push_local_task(struct starpu_worker_s *worker, struct starpu_task *
 	if (STARPU_UNLIKELY(!(worker->worker_mask & task->cl->where)))
 		return -ENODEV;
 
-	PTHREAD_MUTEX_LOCK(&worker->local_tasks_mutex);
+	PTHREAD_MUTEX_LOCK(worker->sched_mutex);
 	starpu_task_list_push_front(&worker->local_tasks, task);
-	PTHREAD_MUTEX_UNLOCK(&worker->local_tasks_mutex);
-
-#ifndef STARPU_NON_BLOCKING_DRIVERS
-	/* XXX that's a bit excessive ... */
-	_starpu_wake_all_blocked_workers_on_node(worker->memory_node);
-#endif
+	PTHREAD_COND_BROADCAST(worker->sched_cond);
+	PTHREAD_MUTEX_UNLOCK(worker->sched_mutex);
 
 	return 0;
 }

+ 0 - 1
src/core/workers.c

@@ -159,7 +159,6 @@ static void _starpu_launch_drivers(struct starpu_machine_config_s *config)
 		workerarg->terminated_jobs = starpu_job_list_new();
 
 		starpu_task_list_init(&workerarg->local_tasks);
-		PTHREAD_MUTEX_INIT(&workerarg->local_tasks_mutex, NULL);
 	
 		workerarg->status = STATUS_INITIALIZING;
 

+ 0 - 1
src/core/workers.h

@@ -71,7 +71,6 @@ struct starpu_worker_s {
 	pthread_cond_t *sched_cond; /* condition variable used when the worker waits for tasks. */
 	pthread_mutex_t *sched_mutex; /* mutex protecting sched_cond */
 	struct starpu_task_list local_tasks; /* this queue contains tasks that have been explicitely submitted to that queue */
-	pthread_mutex_t local_tasks_mutex; /* protect the local_tasks list */
 	struct starpu_worker_set_s *set; /* in case this worker belongs to a set */
 	struct starpu_job_list_s *terminated_jobs; /* list of pending jobs which were executed */
 	unsigned worker_is_running;