Browse Source

add wrapper

Olivier Aumage 8 years ago
parent
commit
fe1082e42b
2 changed files with 18 additions and 10 deletions
  1. 1 10
      src/core/sched_ctx.c
  2. 17 0
      src/core/workers.h

+ 1 - 10
src/core/sched_ctx.c

@@ -1160,16 +1160,7 @@ void starpu_sched_ctx_delete(unsigned sched_ctx_id)
 		{
 			struct _starpu_worker *worker = _starpu_get_worker_struct(backup_workerids[i]);
 			STARPU_PTHREAD_MUTEX_LOCK(&worker->sched_mutex);
-			if (worker->state_sched_op_pending)
-			{
-				worker->state_changing_ctx_waiting = 1;
-				do
-				{
-					STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex);
-				}
-				while (worker->state_sched_op_pending);
-				worker->state_changing_ctx_waiting = 0;
-			}
+			_starpu_worker_wait_for_transient_sched_op_completion(worker);
 		}
 
 		_starpu_update_locked_workers_without_ctx(workerids, nworkers_ctx, sched_ctx_id, 1);

+ 17 - 0
src/core/workers.h

@@ -644,4 +644,21 @@ static inline void  _starpu_worker_leave_transient_sched_op(struct _starpu_worke
 		STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond);
 }
 
+/* Must be called with worker's sched_mutex held.
+ * Passively wait until state_sched_op_pending is cleared.
+ */
+static inline void _starpu_worker_wait_for_transient_sched_op_completion(struct _starpu_worker * const worker)
+{
+	if (worker->state_sched_op_pending)
+	{
+		worker->state_changing_ctx_waiting = 1;
+		do
+		{
+			STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex);
+		}
+		while (worker->state_sched_op_pending);
+		worker->state_changing_ctx_waiting = 0;
+	}
+}
+
 #endif // __WORKERS_H__