Re: [PATCH v2] perf tools: Work around lack of sched_getcpu in glibc < 2.6.

Arnaldo Carvalho de Melo
2015-03-20T20:40:01Z

Em Fri, Mar 20, 2015 at 11:44:42AM -0700, Vinson Lee escreveu:
> On Fri, Mar 20, 2015 at 6:03 AM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> > So for strlcpy we have in tools/perf/util/cache.h:

> > #ifndef __UCLIBC__
> > /* Matches the libc/libbsd function attribute so we declare this
> > * unconditionally: */
> > extern size_t strlcpy(char *dest, const char *src, size_t size);
> > #endif

> > I.e. have the ifdef just in the header file.

This part you didn't take into account, the __weak marked part is ok,
the linker will DTRT with that, its just the redeclaration part that
needs to get out of the way, enclose that under appropriate ifdef, i.e.
one that is associated with the libc where that file first appeared and
that has been present since then.

- Arnaldo

> > This way, if we end up needing to use sched_getcpu elsewhere, it will
> > work and the needed #ifdef will be constrained to the header file.

> I tried moving the prototype to a header file and it does not compile
> with newer glibc for me either. I still get a "redundant
> redeclaration" compiler error.

> Here is the diff that I tried.

> diff --git a/tools/perf/util/cloexec.c b/tools/perf/util/cloexec.c
> @@ -7,6 +7,12 @@
>
> static unsigned long flag = PERF_FLAG_FD_CLOEXEC;
>
> +int __weak sched_getcpu(void)
> +{
> + errno = ENOSYS;
> + return -1;
> +}
> +
> static int perf_flag_probe(void)
> {
> /* use 'safest' configuration as used in perf_evsel__fallback() */
> diff --git a/tools/perf/util/cloexec.h b/tools/perf/util/cloexec.h
> @@ -3,4 +3,6 @@
>
> unsigned long perf_event_open_cloexec_flag(void);
>
> +extern int sched_getcpu(void) __THROW;
> +
> #endif /* __PERF_CLOEXEC_H */