perf tui: Allow disabling the TUI on a per command basis in ~/.perfconfig

Using the same scheme as for git's/perf's pager setup, i.e. if one
doesn't want to, on a newt enabled perf binary, to disable the TUI for
'perf report', its just a matter of doing:

  [root@doppio linux-2.6-tip]# printf "[tui]\n\nreport = off\n" >
  /root/.perfconfig
  [root@doppio linux-2.6-tip]# cat /root/.perfconfig
  [tui]

  report = off
  [root@doppio linux-2.6-tip]#

System wide settings are also possible, by editing /etc/perfconfig, etc,
i.e. the git machinery for config files applies to perf as well, so when
in doubt where to put your settings, consult the git documentation, if
it fails, please let us know.

Suggested-by: Ingo Molnar <mingo@elte.hu>
Discussed-with: Stephane Eranian <eranian@google.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2010-05-20 22:01:10 -03:00
Родитель ef365cefbc
Коммит 5d06e6915b
4 изменённых файлов: 35 добавлений и 11 удалений

Просмотреть файл

@ -116,7 +116,7 @@ static int perf_session__add_hist_entry(struct perf_session *self,
* so we don't allocated the extra space needed because the stdio * so we don't allocated the extra space needed because the stdio
* code will not use it. * code will not use it.
*/ */
if (use_browser) if (use_browser > 0)
err = hist_entry__inc_addr_samples(he, al->addr); err = hist_entry__inc_addr_samples(he, al->addr);
out_free_syms: out_free_syms:
free(syms); free(syms);
@ -330,7 +330,7 @@ static int __cmd_report(void)
hists = rb_entry(next, struct hists, rb_node); hists = rb_entry(next, struct hists, rb_node);
hists__collapse_resort(hists); hists__collapse_resort(hists);
hists__output_resort(hists); hists__output_resort(hists);
if (use_browser) if (use_browser > 0)
hists__browse(hists, help, input_name); hists__browse(hists, help, input_name);
else { else {
const char *evname = NULL; const char *evname = NULL;
@ -347,7 +347,7 @@ static int __cmd_report(void)
next = rb_next(&hists->rb_node); next = rb_next(&hists->rb_node);
} }
if (!use_browser && sort_order == default_sort_order && if (use_browser <= 0 && sort_order == default_sort_order &&
parent_pattern == default_parent_pattern) { parent_pattern == default_parent_pattern) {
fprintf(stdout, "#\n# (%s)\n#\n", help); fprintf(stdout, "#\n# (%s)\n#\n", help);
@ -491,7 +491,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __used)
* so don't allocate extra space that won't be used in the stdio * so don't allocate extra space that won't be used in the stdio
* implementation. * implementation.
*/ */
if (use_browser) if (use_browser > 0)
symbol_conf.priv_size = sizeof(struct sym_priv); symbol_conf.priv_size = sizeof(struct sym_priv);
if (symbol__init() < 0) if (symbol__init() < 0)

Просмотреть файл

@ -15,15 +15,15 @@
#include "util/parse-events.h" #include "util/parse-events.h"
#include "util/debugfs.h" #include "util/debugfs.h"
bool use_browser;
const char perf_usage_string[] = const char perf_usage_string[] =
"perf [--version] [--help] COMMAND [ARGS]"; "perf [--version] [--help] COMMAND [ARGS]";
const char perf_more_info_string[] = const char perf_more_info_string[] =
"See 'perf help COMMAND' for more information on a specific command."; "See 'perf help COMMAND' for more information on a specific command.";
int use_browser = -1;
static int use_pager = -1; static int use_pager = -1;
struct pager_config { struct pager_config {
const char *cmd; const char *cmd;
int val; int val;
@ -49,6 +49,24 @@ int check_pager_config(const char *cmd)
return c.val; return c.val;
} }
static int tui_command_config(const char *var, const char *value, void *data)
{
struct pager_config *c = data;
if (!prefixcmp(var, "tui.") && !strcmp(var + 4, c->cmd))
c->val = perf_config_bool(var, value);
return 0;
}
/* returns 0 for "no tui", 1 for "use tui", and -1 for "not specified" */
static int check_tui_config(const char *cmd)
{
struct pager_config c;
c.cmd = cmd;
c.val = -1;
perf_config(tui_command_config, &c);
return c.val;
}
static void commit_pager_choice(void) static void commit_pager_choice(void)
{ {
switch (use_pager) { switch (use_pager) {
@ -255,6 +273,9 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
if (p->option & RUN_SETUP) if (p->option & RUN_SETUP)
prefix = NULL; /* setup_perf_directory(); */ prefix = NULL; /* setup_perf_directory(); */
if (use_browser == -1)
use_browser = check_tui_config(p->cmd);
if (use_pager == -1 && p->option & RUN_SETUP) if (use_pager == -1 && p->option & RUN_SETUP)
use_pager = check_pager_config(p->cmd); use_pager = check_pager_config(p->cmd);
if (use_pager == -1 && p->option & USE_PAGER) if (use_pager == -1 && p->option & USE_PAGER)

Просмотреть файл

@ -30,7 +30,7 @@ extern const char *pager_program;
extern int pager_in_use(void); extern int pager_in_use(void);
extern int pager_use_color; extern int pager_use_color;
extern bool use_browser; extern int use_browser;
#ifdef NO_NEWT_SUPPORT #ifdef NO_NEWT_SUPPORT
static inline void setup_browser(void) static inline void setup_browser(void)

Просмотреть файл

@ -1066,10 +1066,13 @@ static struct newtPercentTreeColors {
void setup_browser(void) void setup_browser(void)
{ {
struct newtPercentTreeColors *c = &defaultPercentTreeColors; struct newtPercentTreeColors *c = &defaultPercentTreeColors;
if (!isatty(1))
return;
use_browser = true; if (!isatty(1) || !use_browser) {
setup_pager();
return;
}
use_browser = 1;
newtInit(); newtInit();
newtCls(); newtCls();
ui_helpline__puts(" "); ui_helpline__puts(" ");
@ -1082,7 +1085,7 @@ void setup_browser(void)
void exit_browser(bool wait_for_ok) void exit_browser(bool wait_for_ok)
{ {
if (use_browser) { if (use_browser > 0) {
if (wait_for_ok) { if (wait_for_ok) {
char title[] = "Fatal Error", ok[] = "Ok"; char title[] = "Fatal Error", ok[] = "Ok";
newtWinMessage(title, ok, browser__last_msg); newtWinMessage(title, ok, browser__last_msg);