|
@@ -531,8 +531,6 @@ struct _starpu_sched_ctx* _starpu_create_sched_ctx(struct starpu_sched_policy *p
|
|
|
STARPU_PTHREAD_MUTEX_INIT(&sched_ctx->waiting_tasks_mutex, NULL);
|
|
|
starpu_task_list_init(&sched_ctx->waiting_tasks);
|
|
|
|
|
|
- STARPU_PTHREAD_MUTEX_INIT(&sched_ctx->sched_ctx_list_mutex, NULL);
|
|
|
-
|
|
|
if (policy)
|
|
|
{
|
|
|
_STARPU_MALLOC(sched_ctx->sched_policy, sizeof(struct starpu_sched_policy));
|
|
@@ -1122,7 +1120,6 @@ static void _starpu_delete_sched_ctx(struct _starpu_sched_ctx *sched_ctx)
|
|
|
|
|
|
STARPU_PTHREAD_MUTEX_DESTROY(&sched_ctx->empty_ctx_mutex);
|
|
|
STARPU_PTHREAD_MUTEX_DESTROY(&sched_ctx->waiting_tasks_mutex);
|
|
|
- STARPU_PTHREAD_MUTEX_DESTROY(&sched_ctx->sched_ctx_list_mutex);
|
|
|
sched_ctx->id = STARPU_NMAX_SCHED_CTXS;
|
|
|
#ifdef STARPU_HAVE_HWLOC
|
|
|
hwloc_bitmap_free(sched_ctx->hwloc_workers_set);
|
|
@@ -2287,13 +2284,14 @@ void starpu_sched_ctx_list_task_counters_increment_all(struct starpu_task *task,
|
|
|
struct starpu_sched_ctx_iterator it;
|
|
|
|
|
|
workers->init_iterator_for_parallel_tasks(workers, &it, task);
|
|
|
- STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->sched_ctx_list_mutex);
|
|
|
+ starpu_pthread_rwlock_t *changing_ctx_mutex = _starpu_sched_ctx_get_changing_ctx_mutex(sched_ctx->id);
|
|
|
+ STARPU_PTHREAD_RWLOCK_RDLOCK(changing_ctx_mutex);
|
|
|
while(workers->has_next(workers, &it))
|
|
|
{
|
|
|
int worker = workers->get_next(workers, &it);
|
|
|
starpu_sched_ctx_list_task_counters_increment(sched_ctx_id, worker);
|
|
|
}
|
|
|
- STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->sched_ctx_list_mutex);
|
|
|
+ STARPU_PTHREAD_RWLOCK_UNLOCK(changing_ctx_mutex);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2313,7 +2311,8 @@ void starpu_sched_ctx_list_task_counters_decrement_all(struct starpu_task *task,
|
|
|
struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id);
|
|
|
struct starpu_sched_ctx_iterator it;
|
|
|
workers->init_iterator_for_parallel_tasks(workers, &it, task);
|
|
|
- STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->sched_ctx_list_mutex);
|
|
|
+ starpu_pthread_rwlock_t *changing_ctx_mutex = _starpu_sched_ctx_get_changing_ctx_mutex(sched_ctx->id);
|
|
|
+ STARPU_PTHREAD_RWLOCK_RDLOCK(changing_ctx_mutex);
|
|
|
while(workers->has_next(workers, &it))
|
|
|
{
|
|
|
int worker = workers->get_next(workers, &it);
|
|
@@ -2326,7 +2325,7 @@ void starpu_sched_ctx_list_task_counters_decrement_all(struct starpu_task *task,
|
|
|
STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker_str->sched_mutex);
|
|
|
}
|
|
|
}
|
|
|
- STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->sched_ctx_list_mutex);
|
|
|
+ STARPU_PTHREAD_RWLOCK_UNLOCK(changing_ctx_mutex);
|
|
|
|
|
|
if(curr_workerid != -1)
|
|
|
STARPU_PTHREAD_MUTEX_LOCK_SCHED(&curr_worker_str->sched_mutex);
|
|
@@ -2349,7 +2348,8 @@ void starpu_sched_ctx_list_task_counters_reset_all(struct starpu_task *task, uns
|
|
|
struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id);
|
|
|
struct starpu_sched_ctx_iterator it;
|
|
|
workers->init_iterator_for_parallel_tasks(workers, &it, task);
|
|
|
- STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->sched_ctx_list_mutex);
|
|
|
+ starpu_pthread_rwlock_t *changing_ctx_mutex = _starpu_sched_ctx_get_changing_ctx_mutex(sched_ctx->id);
|
|
|
+ STARPU_PTHREAD_RWLOCK_RDLOCK(changing_ctx_mutex);
|
|
|
while(workers->has_next(workers, &it))
|
|
|
{
|
|
|
int worker = workers->get_next(workers, &it);
|
|
@@ -2361,7 +2361,7 @@ void starpu_sched_ctx_list_task_counters_reset_all(struct starpu_task *task, uns
|
|
|
STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker_str->sched_mutex);
|
|
|
}
|
|
|
}
|
|
|
- STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->sched_ctx_list_mutex);
|
|
|
+ STARPU_PTHREAD_RWLOCK_UNLOCK(changing_ctx_mutex);
|
|
|
|
|
|
if(curr_workerid != -1)
|
|
|
STARPU_PTHREAD_MUTEX_LOCK_SCHED(&curr_worker_str->sched_mutex);
|