|
@@ -94,32 +94,10 @@ static int pmu_format(const char *name, struct list_head *format)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int perf_pmu__parse_scale(struct perf_pmu_alias *alias, char *dir, char *name)
|
|
|
+static int convert_scale(const char *scale, char **end, double *sval)
|
|
|
{
|
|
|
- struct stat st;
|
|
|
- ssize_t sret;
|
|
|
- char scale[128];
|
|
|
- int fd, ret = -1;
|
|
|
- char path[PATH_MAX];
|
|
|
char *lc;
|
|
|
-
|
|
|
- snprintf(path, PATH_MAX, "%s/%s.scale", dir, name);
|
|
|
-
|
|
|
- fd = open(path, O_RDONLY);
|
|
|
- if (fd == -1)
|
|
|
- return -1;
|
|
|
-
|
|
|
- if (fstat(fd, &st) < 0)
|
|
|
- goto error;
|
|
|
-
|
|
|
- sret = read(fd, scale, sizeof(scale)-1);
|
|
|
- if (sret < 0)
|
|
|
- goto error;
|
|
|
-
|
|
|
- if (scale[sret - 1] == '\n')
|
|
|
- scale[sret - 1] = '\0';
|
|
|
- else
|
|
|
- scale[sret] = '\0';
|
|
|
+ int ret = 0;
|
|
|
|
|
|
/*
|
|
|
* save current locale
|
|
@@ -134,7 +112,7 @@ static int perf_pmu__parse_scale(struct perf_pmu_alias *alias, char *dir, char *
|
|
|
lc = strdup(lc);
|
|
|
if (!lc) {
|
|
|
ret = -ENOMEM;
|
|
|
- goto error;
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -144,14 +122,42 @@ static int perf_pmu__parse_scale(struct perf_pmu_alias *alias, char *dir, char *
|
|
|
*/
|
|
|
setlocale(LC_NUMERIC, "C");
|
|
|
|
|
|
- alias->scale = strtod(scale, NULL);
|
|
|
+ *sval = strtod(scale, end);
|
|
|
|
|
|
+out:
|
|
|
/* restore locale */
|
|
|
setlocale(LC_NUMERIC, lc);
|
|
|
-
|
|
|
free(lc);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static int perf_pmu__parse_scale(struct perf_pmu_alias *alias, char *dir, char *name)
|
|
|
+{
|
|
|
+ struct stat st;
|
|
|
+ ssize_t sret;
|
|
|
+ char scale[128];
|
|
|
+ int fd, ret = -1;
|
|
|
+ char path[PATH_MAX];
|
|
|
+
|
|
|
+ snprintf(path, PATH_MAX, "%s/%s.scale", dir, name);
|
|
|
+
|
|
|
+ fd = open(path, O_RDONLY);
|
|
|
+ if (fd == -1)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ if (fstat(fd, &st) < 0)
|
|
|
+ goto error;
|
|
|
+
|
|
|
+ sret = read(fd, scale, sizeof(scale)-1);
|
|
|
+ if (sret < 0)
|
|
|
+ goto error;
|
|
|
+
|
|
|
+ if (scale[sret - 1] == '\n')
|
|
|
+ scale[sret - 1] = '\0';
|
|
|
+ else
|
|
|
+ scale[sret] = '\0';
|
|
|
|
|
|
- ret = 0;
|
|
|
+ ret = convert_scale(scale, NULL, &alias->scale);
|
|
|
error:
|
|
|
close(fd);
|
|
|
return ret;
|