Browse Source

openmp: do not return an error when boolean envvars are incorrectly set

Samuel Pitoiset 9 years ago
parent
commit
5b884d79c5
1 changed files with 35 additions and 23 deletions
  1. 35 23
      src/util/openmp_runtime_support_environment.c

+ 35 - 23
src/util/openmp_runtime_support_environment.c

@@ -103,27 +103,21 @@ static int stringsn_cmp(const char *strings[], const char *str, size_t n)
 }
 }
 
 
 /* TODO: move to utils */
 /* TODO: move to utils */
-static void read_boolean_var(const char *var, int *dest)
+static int read_boolean_var(const char *str, int *dst)
 {
 {
-	const char *env = starpu_getenv(var);
-	if (env)
-	{
-		char *str = strdup(env);
-		if (str == NULL)
-			_STARPU_ERROR("memory allocation failed\n");
-		remove_spaces(str);
-		if (str[0] == '\0')
-		{
-			free(str);
-			return;
-		}
-		static const char *strings[] = { "false", "true", NULL };
-		int mode = strings_cmp(strings, str);
-		if (mode < 0)
-			_STARPU_ERROR("parse error in variable %s\n", var);
-		*dest = mode;
-		free(str);
-	}
+	const char *strings[] = { "false", "true", NULL };
+	char *endptr;
+	int val;
+
+	if (!str)
+		return 0;
+
+	val = strings_cmp(strings, str);
+	if (val < 0)
+		return 0;
+
+	*dst = val;
+	return 1;
 }
 }
 
 
 /* TODO: move to utils */
 /* TODO: move to utils */
@@ -687,16 +681,34 @@ static void read_omp_int_var(const char *name, int *icv)
 	*icv = value;
 	*icv = value;
 }
 }
 
 
+static void read_omp_boolean_var(const char *name, int *icv)
+{
+	int ret, value;
+	char *env;
+
+	env = starpu_getenv(name);
+	if (!env)
+		return;
+
+	ret = read_boolean_var(env, &value);
+	if (!ret)
+	{
+		fprintf(stderr, "StarPU: Invalid value for environment variable %s\n", name);
+		return;
+	}
+	*icv = value;
+}
+
 static void read_omp_environment(void)
 static void read_omp_environment(void)
 {
 {
-	read_boolean_var("OMP_DYNAMIC", &_initial_icv_values.dyn_var);
-	read_boolean_var("OMP_NESTED", &_initial_icv_values.nest_var);
+	read_omp_boolean_var("OMP_DYNAMIC", &_initial_icv_values.dyn_var);
+	read_omp_boolean_var("OMP_NESTED", &_initial_icv_values.nest_var);
 	read_sched_var("OMP_SCHEDULE", &_initial_icv_values.run_sched_var, &_initial_icv_values.run_sched_chunk_var);
 	read_sched_var("OMP_SCHEDULE", &_initial_icv_values.run_sched_var, &_initial_icv_values.run_sched_chunk_var);
 	read_size_var("OMP_STACKSIZE", &_initial_icv_values.stacksize_var);
 	read_size_var("OMP_STACKSIZE", &_initial_icv_values.stacksize_var);
 	read_wait_policy_var("OMP_WAIT_POLICY", &_initial_icv_values.wait_policy_var);
 	read_wait_policy_var("OMP_WAIT_POLICY", &_initial_icv_values.wait_policy_var);
 	read_omp_int_var("OMP_THREAD_LIMIT", &_initial_icv_values.thread_limit_var);
 	read_omp_int_var("OMP_THREAD_LIMIT", &_initial_icv_values.thread_limit_var);
 	read_omp_int_var("OMP_MAX_ACTIVE_LEVELS", &_initial_icv_values.max_active_levels_var);
 	read_omp_int_var("OMP_MAX_ACTIVE_LEVELS", &_initial_icv_values.max_active_levels_var);
-	read_boolean_var("OMP_CANCELLATION", &_initial_icv_values.cancel_var);
+	read_omp_boolean_var("OMP_CANCELLATION", &_initial_icv_values.cancel_var);
 	read_omp_int_var("OMP_DEFAULT_DEVICE", &_initial_icv_values.default_device_var);
 	read_omp_int_var("OMP_DEFAULT_DEVICE", &_initial_icv_values.default_device_var);
 	read_omp_int_var("OMP_MAX_TASK_PRIORITY", &_initial_icv_values.max_task_priority_var);
 	read_omp_int_var("OMP_MAX_TASK_PRIORITY", &_initial_icv_values.max_task_priority_var);