perf evsel: Do not put a variable sized type not at the end of a struct
As this is a GNU extension and while harmless in this case, we can do the same thing in a more clearer way by using a existing thread_map and cpu_map constructors: With this we avoid this while compiling with clang: util/evsel.c:1659:17: error: field 'map' with variable sized type 'struct cpu_map' not at the end of a struct or class is a GNU extension [-Werror,-Wgnu-variable-sized-type-not-at-end] struct cpu_map map; ^ util/evsel.c:1667:20: error: field 'map' with variable sized type 'struct thread_map' not at the end of a struct or class is a GNU extension [-Werror,-Wgnu-variable-sized-type-not-at-end] struct thread_map map; ^ Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/n/tip-207juvrqjiar7uvas2s83v5i@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
8a2efd6dd5
commit
c24ae6d961
|
@ -1448,7 +1448,7 @@ static bool ignore_missing_thread(struct perf_evsel *evsel,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
|
int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
|
||||||
struct thread_map *threads)
|
struct thread_map *threads)
|
||||||
{
|
{
|
||||||
int cpu, thread, nthreads;
|
int cpu, thread, nthreads;
|
||||||
|
@ -1459,6 +1459,30 @@ static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
|
||||||
if (perf_missing_features.write_backward && evsel->attr.write_backward)
|
if (perf_missing_features.write_backward && evsel->attr.write_backward)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (cpus == NULL) {
|
||||||
|
static struct cpu_map *empty_cpu_map;
|
||||||
|
|
||||||
|
if (empty_cpu_map == NULL) {
|
||||||
|
empty_cpu_map = cpu_map__dummy_new();
|
||||||
|
if (empty_cpu_map == NULL)
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
cpus = empty_cpu_map;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (threads == NULL) {
|
||||||
|
static struct thread_map *empty_thread_map;
|
||||||
|
|
||||||
|
if (empty_thread_map == NULL) {
|
||||||
|
empty_thread_map = thread_map__new_by_tid(-1);
|
||||||
|
if (empty_thread_map == NULL)
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
threads = empty_thread_map;
|
||||||
|
}
|
||||||
|
|
||||||
if (evsel->system_wide)
|
if (evsel->system_wide)
|
||||||
nthreads = 1;
|
nthreads = 1;
|
||||||
else
|
else
|
||||||
|
@ -1655,46 +1679,16 @@ void perf_evsel__close(struct perf_evsel *evsel, int ncpus, int nthreads)
|
||||||
perf_evsel__free_fd(evsel);
|
perf_evsel__free_fd(evsel);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct {
|
|
||||||
struct cpu_map map;
|
|
||||||
int cpus[1];
|
|
||||||
} empty_cpu_map = {
|
|
||||||
.map.nr = 1,
|
|
||||||
.cpus = { -1, },
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct {
|
|
||||||
struct thread_map map;
|
|
||||||
int threads[1];
|
|
||||||
} empty_thread_map = {
|
|
||||||
.map.nr = 1,
|
|
||||||
.threads = { -1, },
|
|
||||||
};
|
|
||||||
|
|
||||||
int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
|
|
||||||
struct thread_map *threads)
|
|
||||||
{
|
|
||||||
if (cpus == NULL) {
|
|
||||||
/* Work around old compiler warnings about strict aliasing */
|
|
||||||
cpus = &empty_cpu_map.map;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (threads == NULL)
|
|
||||||
threads = &empty_thread_map.map;
|
|
||||||
|
|
||||||
return __perf_evsel__open(evsel, cpus, threads);
|
|
||||||
}
|
|
||||||
|
|
||||||
int perf_evsel__open_per_cpu(struct perf_evsel *evsel,
|
int perf_evsel__open_per_cpu(struct perf_evsel *evsel,
|
||||||
struct cpu_map *cpus)
|
struct cpu_map *cpus)
|
||||||
{
|
{
|
||||||
return __perf_evsel__open(evsel, cpus, &empty_thread_map.map);
|
return perf_evsel__open(evsel, cpus, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int perf_evsel__open_per_thread(struct perf_evsel *evsel,
|
int perf_evsel__open_per_thread(struct perf_evsel *evsel,
|
||||||
struct thread_map *threads)
|
struct thread_map *threads)
|
||||||
{
|
{
|
||||||
return __perf_evsel__open(evsel, &empty_cpu_map.map, threads);
|
return perf_evsel__open(evsel, NULL, threads);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int perf_evsel__parse_id_sample(const struct perf_evsel *evsel,
|
static int perf_evsel__parse_id_sample(const struct perf_evsel *evsel,
|
||||||
|
|
Loading…
Reference in New Issue