From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755822AbbLQA5u (ORCPT ); Wed, 16 Dec 2015 19:57:50 -0500 Received: from mail.kernel.org ([198.145.29.136]:35617 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755156AbbLQA5q (ORCPT ); Wed, 16 Dec 2015 19:57:46 -0500 Date: Wed, 16 Dec 2015 21:57:41 -0300 From: Arnaldo Carvalho de Melo To: Josh Poimboeuf Cc: Peter Zijlstra , Ingo Molnar , linux-kernel@vger.kernel.org, Jiri Olsa , Namhyung Kim Subject: Re: [PATCH v4 7/9] perf: Finalize subcmd independence Message-ID: <20151217005741.GF19926@kernel.org> References: <6e12946f0f26ce4d543d34db68d9dae3c8551cb9.1450193761.git.jpoimboe@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <6e12946f0f26ce4d543d34db68d9dae3c8551cb9.1450193761.git.jpoimboe@redhat.com> X-Url: http://acmel.wordpress.com User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Em Tue, Dec 15, 2015 at 09:39:38AM -0600, Josh Poimboeuf escreveu: > For the files that will be moved to the subcmd library, remove all their > perf-specific includes and duplicate any needed functionality. Breaks rhel6.7 building: > #include "run-command.h" > #include "sigchain.h" > #include "subcmd-config.h" > diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c > index c1da2a5..f424027 100644 > --- a/tools/perf/util/parse-options.c > +++ b/tools/perf/util/parse-options.c > @@ -1,33 +1,47 @@ > -#include "util.h" > +#include > +#include > +#include > +#include > +#include > +#include > #include "subcmd-util.h" > #include "parse-options.h" > -#include "cache.h" > -#include "header.h" > #include "subcmd-config.h" > -#include > +#include "pager.h" > > #define OPT_SHORT 1 > #define OPT_UNSET 2 > > +typedef uint64_t u64; > + [acme@sandy linux]$ cat /etc/redhat-release Red Hat Enterprise Linux Server release 6.7 (Santiago) CC /tmp/build/perf/parse-options.o parse-options.c:15: error: redefinition of typedef ‘u64’ /home/acme/git/linux/tools/include/linux/types.h:28: note: previous declaration of ‘u64’ was here mv: cannot stat `/tmp/build/perf/.parse-options.o.tmp': No such file or directory make[3]: *** [/tmp/build/perf/parse-options.o] Error 1 make[2]: *** [/tmp/build/perf/libsubcmd-in.o] Error 2 make[1]: *** [/tmp/build/perf/libsubcmd.a] Error 2 make[1]: *** Waiting for unfinished jobs.... MKDIR /tmp/build/perf/util/ > char *error_buf; > > static int opterror(const struct option *opt, const char *reason, int flags) > { > if (flags & OPT_SHORT) > - return error("switch `%c' %s", opt->short_name, reason); > - if (flags & OPT_UNSET) > - return error("option `no-%s' %s", opt->long_name, reason); > - return error("option `%s' %s", opt->long_name, reason); > + fprintf(stderr, " Error: switch `%c' %s", opt->short_name, reason); > + else if (flags & OPT_UNSET) > + fprintf(stderr, " Error: option `no-%s' %s", opt->long_name, reason); > + else > + fprintf(stderr, " Error: option `%s' %s", opt->long_name, reason); > + > + return -1; > +} > + > +static const char *skip_prefix(const char *str, const char *prefix) > +{ > + size_t len = strlen(prefix); > + return strncmp(str, prefix, len) ? NULL : str + len; > } > > static void optwarning(const struct option *opt, const char *reason, int flags) > { > if (flags & OPT_SHORT) > - warning("switch `%c' %s", opt->short_name, reason); > + fprintf(stderr, " Warning: switch `%c' %s", opt->short_name, reason); > else if (flags & OPT_UNSET) > - warning("option `no-%s' %s", opt->long_name, reason); > + fprintf(stderr, " Warning: option `no-%s' %s", opt->long_name, reason); > else > - warning("option `%s' %s", opt->long_name, reason); > + fprintf(stderr, " Warning: option `%s' %s", opt->long_name, reason); > } > > static int get_arg(struct parse_opt_ctx_t *p, const struct option *opt, > @@ -71,11 +85,11 @@ static int get_value(struct parse_opt_ctx_t *p, > > if (((flags & OPT_SHORT) && p->excl_opt->short_name) || > p->excl_opt->long_name == NULL) { > - scnprintf(msg, sizeof(msg), "cannot be used with switch `%c'", > - p->excl_opt->short_name); > + snprintf(msg, sizeof(msg), "cannot be used with switch `%c'", > + p->excl_opt->short_name); > } else { > - scnprintf(msg, sizeof(msg), "cannot be used with %s", > - p->excl_opt->long_name); > + snprintf(msg, sizeof(msg), "cannot be used with %s", > + p->excl_opt->long_name); > } > opterror(opt, msg, flags); > return -3; > @@ -401,14 +415,16 @@ match: > return get_value(p, options, flags); > } > > - if (ambiguous_option) > - return error("Ambiguous option: %s " > - "(could be --%s%s or --%s%s)", > - arg, > - (ambiguous_flags & OPT_UNSET) ? "no-" : "", > - ambiguous_option->long_name, > - (abbrev_flags & OPT_UNSET) ? "no-" : "", > - abbrev_option->long_name); > + if (ambiguous_option) { > + fprintf(stderr, > + " Error: Ambiguous option: %s (could be --%s%s or --%s%s)", > + arg, > + (ambiguous_flags & OPT_UNSET) ? "no-" : "", > + ambiguous_option->long_name, > + (abbrev_flags & OPT_UNSET) ? "no-" : "", > + abbrev_option->long_name); > + return -1; > + } > if (abbrev_option) > return get_value(p, abbrev_option, abbrev_flags); > return -2; > @@ -420,7 +436,7 @@ static void check_typos(const char *arg, const struct option *options) > return; > > if (!prefixcmp(arg, "no-")) { > - error ("did you mean `--%s` (with two dashes ?)", arg); > + fprintf(stderr, " Error: did you mean `--%s` (with two dashes ?)", arg); > exit(129); > } > > @@ -428,7 +444,7 @@ static void check_typos(const char *arg, const struct option *options) > if (!options->long_name) > continue; > if (!prefixcmp(options->long_name, arg)) { > - error ("did you mean `--%s` (with two dashes ?)", arg); > + fprintf(stderr, " Error: did you mean `--%s` (with two dashes ?)", arg); > exit(129); > } > } > @@ -746,16 +762,18 @@ static int option__cmp(const void *va, const void *vb) > > static struct option *options__order(const struct option *opts) > { > - int nr_opts = 0; > + int nr_opts = 0, len; > const struct option *o = opts; > struct option *ordered; > > for (o = opts; o->type != OPTION_END; o++) > ++nr_opts; > > - ordered = memdup(opts, sizeof(*o) * (nr_opts + 1)); > - if (ordered == NULL) > + len = sizeof(*o) * (nr_opts + 1); > + ordered = malloc(len); > + if (!ordered) > goto out; > + memcpy(ordered, opts, len); > > qsort(ordered, nr_opts, sizeof(*o), option__cmp); > out: > diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h > index d1544069..dec893f 100644 > --- a/tools/perf/util/parse-options.h > +++ b/tools/perf/util/parse-options.h > @@ -1,8 +1,8 @@ > #ifndef __PERF_PARSE_OPTIONS_H > #define __PERF_PARSE_OPTIONS_H > > -#include > #include > +#include > > enum parse_opt_type { > /* special types */ > diff --git a/tools/perf/util/run-command.c b/tools/perf/util/run-command.c > index 910c0f6..fed37d6 100644 > --- a/tools/perf/util/run-command.c > +++ b/tools/perf/util/run-command.c > @@ -1,7 +1,15 @@ > -#include "cache.h" > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include "subcmd-util.h" > #include "run-command.h" > #include "exec_cmd.h" > -#include "debug.h" > + > +#define STRERR_BUFSIZE 128 > > static inline void close_pair(int fd[2]) > { > @@ -164,8 +172,8 @@ static int wait_or_whine(pid_t pid) > if (waiting < 0) { > if (errno == EINTR) > continue; > - error("waitpid failed (%s)", > - strerror_r(errno, sbuf, sizeof(sbuf))); > + fprintf(stderr, " Error: waitpid failed (%s)", > + strerror_r(errno, sbuf, sizeof(sbuf))); > return -ERR_RUN_COMMAND_WAITPID; > } > if (waiting != pid) > diff --git a/tools/perf/util/run-command.h b/tools/perf/util/run-command.h > index cf7d655..4a55393 100644 > --- a/tools/perf/util/run-command.h > +++ b/tools/perf/util/run-command.h > @@ -1,6 +1,8 @@ > #ifndef __PERF_RUN_COMMAND_H > #define __PERF_RUN_COMMAND_H > > +#include > + > enum { > ERR_RUN_COMMAND_FORK = 10000, > ERR_RUN_COMMAND_EXEC, > diff --git a/tools/perf/util/sigchain.c b/tools/perf/util/sigchain.c > index ba785e9..3537c34 100644 > --- a/tools/perf/util/sigchain.c > +++ b/tools/perf/util/sigchain.c > @@ -1,5 +1,6 @@ > +#include > +#include "subcmd-util.h" > #include "sigchain.h" > -#include "cache.h" > > #define SIGCHAIN_MAX_SIGNALS 32 > > diff --git a/tools/perf/util/subcmd-util.h b/tools/perf/util/subcmd-util.h > index 98fb9f9..321aeb1 100644 > --- a/tools/perf/util/subcmd-util.h > +++ b/tools/perf/util/subcmd-util.h > @@ -1,8 +1,66 @@ > #ifndef __PERF_SUBCMD_UTIL_H > #define __PERF_SUBCMD_UTIL_H > > +#include > +#include > #include > > +#define NORETURN __attribute__((__noreturn__)) > + > +static inline void report(const char *prefix, const char *err, va_list params) > +{ > + char msg[1024]; > + vsnprintf(msg, sizeof(msg), err, params); > + fprintf(stderr, " %s%s\n", prefix, msg); > +} > + > +static NORETURN inline void die(const char *err, ...) > +{ > + va_list params; > + > + va_start(params, err); > + report(" Fatal: ", err, params); > + exit(128); > + va_end(params); > +} > + > +#define zfree(ptr) ({ free(*ptr); *ptr = NULL; }) > + > +#define alloc_nr(x) (((x)+16)*3/2) > + > +/* > + * Realloc the buffer pointed at by variable 'x' so that it can hold > + * at least 'nr' entries; the number of entries currently allocated > + * is 'alloc', using the standard growing factor alloc_nr() macro. > + * > + * DO NOT USE any expression with side-effect for 'x' or 'alloc'. > + */ > +#define ALLOC_GROW(x, nr, alloc) \ > + do { \ > + if ((nr) > alloc) { \ > + if (alloc_nr(alloc) < (nr)) \ > + alloc = (nr); \ > + else \ > + alloc = alloc_nr(alloc); \ > + x = xrealloc((x), alloc * sizeof(*(x))); \ > + } \ > + } while(0) > + > +static inline void *xrealloc(void *ptr, size_t size) > +{ > + void *ret = realloc(ptr, size); > + if (!ret && !size) > + ret = realloc(ptr, 1); > + if (!ret) { > + ret = realloc(ptr, size); > + if (!ret && !size) > + ret = realloc(ptr, 1); > + if (!ret) > + die("Out of memory, realloc failed"); > + } > + return ret; > +} > + > #define astrcatf(out, fmt, ...) \ > ({ \ > char *tmp = *(out); \ > @@ -21,4 +79,13 @@ static inline void astrcat(char **out, const char *add) > free(tmp); > } > > +static inline int prefixcmp(const char *str, const char *prefix) > +{ > + for (; ; str++, prefix++) > + if (!*prefix) > + return 0; > + else if (*str != *prefix) > + return (unsigned char)*prefix - (unsigned char)*str; > +} > + > #endif /* __PERF_SUBCMD_UTIL_H */ > diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h > index 150858f..4b519c5 100644 > --- a/tools/perf/util/util.h > +++ b/tools/perf/util/util.h > @@ -151,12 +151,6 @@ extern void set_warning_routine(void (*routine)(const char *err, va_list params) > extern int prefixcmp(const char *str, const char *prefix); > extern void set_buildid_dir(const char *dir); > > -static inline const char *skip_prefix(const char *str, const char *prefix) > -{ > - size_t len = strlen(prefix); > - return strncmp(str, prefix, len) ? NULL : str + len; > -} > - > #ifdef __GLIBC_PREREQ > #if __GLIBC_PREREQ(2, 1) > #define HAVE_STRCHRNUL > @@ -187,14 +181,6 @@ static inline void *zalloc(size_t size) > > #define zfree(ptr) ({ free(*ptr); *ptr = NULL; }) > > -static inline int has_extension(const char *filename, const char *ext) > -{ > - size_t len = strlen(filename); > - size_t extlen = strlen(ext); > - > - return len > extlen && !memcmp(filename + len - extlen, ext, extlen); > -} > - > /* Sane ctype - no locale, and works with signed chars */ > #undef isascii > #undef isspace > -- > 2.4.3