浏览代码

perfmodel_history: fix safety of using per_arch

Samuel Thibault 4 年之前
父节点
当前提交
f2921af797
共有 1 个文件被更改,包括 13 次插入4 次删除
  1. 13 4
      src/core/perfmodel/perfmodel_history.c

+ 13 - 4
src/core/perfmodel/perfmodel_history.c

@@ -201,15 +201,24 @@ size_t _starpu_job_get_data_size(struct starpu_perfmodel *model, struct starpu_p
 	struct starpu_task *task = j->task;
 	int comb = starpu_perfmodel_arch_comb_get(arch->ndevices, arch->devices);
 
-	if (model && model->state->per_arch && comb != -1 && model->state->per_arch[comb] && model->state->per_arch[comb][impl].size_base)
+	if (model && model->state->per_arch && comb != -1)
 	{
-		return model->state->per_arch[comb][impl].size_base(task, arch, impl);
+		starpu_perfmodel_per_arch_size_base size_base = NULL;
+
+		STARPU_PTHREAD_RWLOCK_RDLOCK(&model->state->model_rwlock);
+		if (model->state->per_arch[comb])
+			size_base = model->state->per_arch[comb][impl].size_base;
+		STARPU_PTHREAD_RWLOCK_UNLOCK(&model->state->model_rwlock);
+
+		if (size_base)
+			return size_base(task, arch, impl);
 	}
-	else if (model && model->size_base)
+
+	if (model && model->size_base)
 	{
 		return model->size_base(task, impl);
 	}
-	else
+
 	{
 		unsigned nbuffers = STARPU_TASK_GET_NBUFFERS(task);
 		size_t size = 0;