Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
Fixes and improvements for perf/core: - perf_target: abstraction for --uid, --pid, --tid, --cpu, --all-cpus handling, eliminating code duplicated in the tools, having constraints that apply to all of them, from Namhyung Kim - Fixes for handling fallback to cpu-clock on PPC, from David Ahern - Fix for processing events with unknown size, from Jiri Olsa - Compilation fix on 32-bit, from Jiri Olsa Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
@@ -547,9 +547,9 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx,
|
||||
struct map_symbol *ms = self->b.priv;
|
||||
struct symbol *sym = ms->sym;
|
||||
const char *help = "<-/ESC: Exit, TAB/shift+TAB: Cycle hot lines, "
|
||||
"H: Go to hottest line, ->/ENTER: Line action, "
|
||||
"O: Toggle offset view, "
|
||||
"S: Toggle source code view";
|
||||
"H: Hottest line, ->/ENTER: Line action, "
|
||||
"O: Offset view, "
|
||||
"S: Source view";
|
||||
int key;
|
||||
|
||||
if (ui_browser__show(&self->b, sym->name, help) < 0)
|
||||
|
||||
@@ -941,7 +941,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
|
||||
goto zoom_dso;
|
||||
case 't':
|
||||
goto zoom_thread;
|
||||
case 's':
|
||||
case '/':
|
||||
if (ui_browser__input_window("Symbol to show",
|
||||
"Please enter the name of symbol you want to see",
|
||||
buf, "ENTER: OK, ESC: Cancel",
|
||||
@@ -969,7 +969,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
|
||||
"E Expand all callchains\n"
|
||||
"d Zoom into current DSO\n"
|
||||
"t Zoom into current Thread\n"
|
||||
"s Filter symbol by name");
|
||||
"/ Filter symbol by name");
|
||||
continue;
|
||||
case K_ENTER:
|
||||
case K_RIGHT:
|
||||
|
||||
+10
-21
@@ -9,24 +9,13 @@
|
||||
|
||||
#define MAX_COLUMNS 32
|
||||
|
||||
void perf_gtk_setup_browser(int argc, const char *argv[],
|
||||
bool fallback_to_pager __used)
|
||||
{
|
||||
gtk_init(&argc, (char ***)&argv);
|
||||
}
|
||||
|
||||
void perf_gtk_exit_browser(bool wait_for_ok __used)
|
||||
{
|
||||
gtk_main_quit();
|
||||
}
|
||||
|
||||
static void perf_gtk_signal(int sig)
|
||||
static void perf_gtk__signal(int sig)
|
||||
{
|
||||
psignal(sig, "perf");
|
||||
gtk_main_quit();
|
||||
}
|
||||
|
||||
static void perf_gtk_resize_window(GtkWidget *window)
|
||||
static void perf_gtk__resize_window(GtkWidget *window)
|
||||
{
|
||||
GdkRectangle rect;
|
||||
GdkScreen *screen;
|
||||
@@ -46,7 +35,7 @@ static void perf_gtk_resize_window(GtkWidget *window)
|
||||
gtk_window_resize(GTK_WINDOW(window), width, height);
|
||||
}
|
||||
|
||||
static void perf_gtk_show_hists(GtkWidget *window, struct hists *hists)
|
||||
static void perf_gtk__show_hists(GtkWidget *window, struct hists *hists)
|
||||
{
|
||||
GType col_types[MAX_COLUMNS];
|
||||
GtkCellRenderer *renderer;
|
||||
@@ -142,11 +131,11 @@ int perf_evlist__gtk_browse_hists(struct perf_evlist *evlist,
|
||||
GtkWidget *notebook;
|
||||
GtkWidget *window;
|
||||
|
||||
signal(SIGSEGV, perf_gtk_signal);
|
||||
signal(SIGFPE, perf_gtk_signal);
|
||||
signal(SIGINT, perf_gtk_signal);
|
||||
signal(SIGQUIT, perf_gtk_signal);
|
||||
signal(SIGTERM, perf_gtk_signal);
|
||||
signal(SIGSEGV, perf_gtk__signal);
|
||||
signal(SIGFPE, perf_gtk__signal);
|
||||
signal(SIGINT, perf_gtk__signal);
|
||||
signal(SIGQUIT, perf_gtk__signal);
|
||||
signal(SIGTERM, perf_gtk__signal);
|
||||
|
||||
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||||
|
||||
@@ -168,7 +157,7 @@ int perf_evlist__gtk_browse_hists(struct perf_evlist *evlist,
|
||||
GTK_POLICY_AUTOMATIC,
|
||||
GTK_POLICY_AUTOMATIC);
|
||||
|
||||
perf_gtk_show_hists(scrolled_window, hists);
|
||||
perf_gtk__show_hists(scrolled_window, hists);
|
||||
|
||||
tab_label = gtk_label_new(evname);
|
||||
|
||||
@@ -179,7 +168,7 @@ int perf_evlist__gtk_browse_hists(struct perf_evlist *evlist,
|
||||
|
||||
gtk_widget_show_all(window);
|
||||
|
||||
perf_gtk_resize_window(window);
|
||||
perf_gtk__resize_window(window);
|
||||
|
||||
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
#include "gtk.h"
|
||||
#include "../../util/cache.h"
|
||||
|
||||
int perf_gtk__init(void)
|
||||
{
|
||||
return gtk_init_check(NULL, NULL) ? 0 : -1;
|
||||
}
|
||||
|
||||
void perf_gtk__exit(bool wait_for_ok __used)
|
||||
{
|
||||
gtk_main_quit();
|
||||
}
|
||||
+29
-139
@@ -1,155 +1,45 @@
|
||||
#include <newt.h>
|
||||
#include <signal.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "../cache.h"
|
||||
#include "../debug.h"
|
||||
#include "browser.h"
|
||||
#include "helpline.h"
|
||||
#include "ui.h"
|
||||
#include "util.h"
|
||||
#include "libslang.h"
|
||||
#include "keysyms.h"
|
||||
|
||||
pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
static volatile int ui__need_resize;
|
||||
|
||||
void ui__refresh_dimensions(bool force)
|
||||
{
|
||||
if (force || ui__need_resize) {
|
||||
ui__need_resize = 0;
|
||||
pthread_mutex_lock(&ui__lock);
|
||||
SLtt_get_screen_size();
|
||||
SLsmg_reinit_smg();
|
||||
pthread_mutex_unlock(&ui__lock);
|
||||
}
|
||||
}
|
||||
|
||||
static void ui__sigwinch(int sig __used)
|
||||
{
|
||||
ui__need_resize = 1;
|
||||
}
|
||||
|
||||
static void ui__setup_sigwinch(void)
|
||||
{
|
||||
static bool done;
|
||||
|
||||
if (done)
|
||||
return;
|
||||
|
||||
done = true;
|
||||
pthread__unblock_sigwinch();
|
||||
signal(SIGWINCH, ui__sigwinch);
|
||||
}
|
||||
|
||||
int ui__getch(int delay_secs)
|
||||
{
|
||||
struct timeval timeout, *ptimeout = delay_secs ? &timeout : NULL;
|
||||
fd_set read_set;
|
||||
int err, key;
|
||||
|
||||
ui__setup_sigwinch();
|
||||
|
||||
FD_ZERO(&read_set);
|
||||
FD_SET(0, &read_set);
|
||||
|
||||
if (delay_secs) {
|
||||
timeout.tv_sec = delay_secs;
|
||||
timeout.tv_usec = 0;
|
||||
}
|
||||
|
||||
err = select(1, &read_set, NULL, NULL, ptimeout);
|
||||
|
||||
if (err == 0)
|
||||
return K_TIMER;
|
||||
|
||||
if (err == -1) {
|
||||
if (errno == EINTR)
|
||||
return K_RESIZE;
|
||||
return K_ERROR;
|
||||
}
|
||||
|
||||
key = SLang_getkey();
|
||||
if (key != K_ESC)
|
||||
return key;
|
||||
|
||||
FD_ZERO(&read_set);
|
||||
FD_SET(0, &read_set);
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 20;
|
||||
err = select(1, &read_set, NULL, NULL, &timeout);
|
||||
if (err == 0)
|
||||
return K_ESC;
|
||||
|
||||
SLang_ungetkey(key);
|
||||
return SLkp_getkey();
|
||||
}
|
||||
|
||||
static void newt_suspend(void *d __used)
|
||||
{
|
||||
newtSuspend();
|
||||
raise(SIGTSTP);
|
||||
newtResume();
|
||||
}
|
||||
|
||||
static int ui__init(void)
|
||||
{
|
||||
int err = SLkp_init();
|
||||
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
SLkp_define_keysym((char *)"^(kB)", SL_KEY_UNTAB);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void ui__exit(void)
|
||||
{
|
||||
SLtt_set_cursor_visibility(1);
|
||||
SLsmg_refresh();
|
||||
SLsmg_reset_smg();
|
||||
SLang_reset_tty();
|
||||
}
|
||||
|
||||
static void ui__signal(int sig)
|
||||
{
|
||||
ui__exit();
|
||||
psignal(sig, "perf");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void setup_browser(bool fallback_to_pager)
|
||||
{
|
||||
if (!isatty(1) || !use_browser || dump_trace) {
|
||||
if (!isatty(1) || dump_trace)
|
||||
use_browser = 0;
|
||||
|
||||
/* default to TUI */
|
||||
if (use_browser < 0)
|
||||
use_browser = 1;
|
||||
|
||||
switch (use_browser) {
|
||||
case 2:
|
||||
if (perf_gtk__init() == 0)
|
||||
break;
|
||||
/* fall through */
|
||||
case 1:
|
||||
use_browser = 1;
|
||||
if (ui__init() == 0)
|
||||
break;
|
||||
/* fall through */
|
||||
default:
|
||||
if (fallback_to_pager)
|
||||
setup_pager();
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
use_browser = 1;
|
||||
newtInit();
|
||||
ui__init();
|
||||
newtSetSuspendCallback(newt_suspend, NULL);
|
||||
ui_helpline__init();
|
||||
ui_browser__init();
|
||||
|
||||
signal(SIGSEGV, ui__signal);
|
||||
signal(SIGFPE, ui__signal);
|
||||
signal(SIGINT, ui__signal);
|
||||
signal(SIGQUIT, ui__signal);
|
||||
signal(SIGTERM, ui__signal);
|
||||
}
|
||||
|
||||
void exit_browser(bool wait_for_ok)
|
||||
{
|
||||
if (use_browser > 0) {
|
||||
if (wait_for_ok)
|
||||
ui__question_window("Fatal Error",
|
||||
ui_helpline__last_msg,
|
||||
"Press any key...", 0);
|
||||
ui__exit();
|
||||
switch (use_browser) {
|
||||
case 2:
|
||||
perf_gtk__exit(wait_for_ok);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
ui__exit(wait_for_ok);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
#include <newt.h>
|
||||
#include <signal.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "../../util/cache.h"
|
||||
#include "../../util/debug.h"
|
||||
#include "../browser.h"
|
||||
#include "../helpline.h"
|
||||
#include "../ui.h"
|
||||
#include "../util.h"
|
||||
#include "../libslang.h"
|
||||
#include "../keysyms.h"
|
||||
|
||||
pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
static volatile int ui__need_resize;
|
||||
|
||||
void ui__refresh_dimensions(bool force)
|
||||
{
|
||||
if (force || ui__need_resize) {
|
||||
ui__need_resize = 0;
|
||||
pthread_mutex_lock(&ui__lock);
|
||||
SLtt_get_screen_size();
|
||||
SLsmg_reinit_smg();
|
||||
pthread_mutex_unlock(&ui__lock);
|
||||
}
|
||||
}
|
||||
|
||||
static void ui__sigwinch(int sig __used)
|
||||
{
|
||||
ui__need_resize = 1;
|
||||
}
|
||||
|
||||
static void ui__setup_sigwinch(void)
|
||||
{
|
||||
static bool done;
|
||||
|
||||
if (done)
|
||||
return;
|
||||
|
||||
done = true;
|
||||
pthread__unblock_sigwinch();
|
||||
signal(SIGWINCH, ui__sigwinch);
|
||||
}
|
||||
|
||||
int ui__getch(int delay_secs)
|
||||
{
|
||||
struct timeval timeout, *ptimeout = delay_secs ? &timeout : NULL;
|
||||
fd_set read_set;
|
||||
int err, key;
|
||||
|
||||
ui__setup_sigwinch();
|
||||
|
||||
FD_ZERO(&read_set);
|
||||
FD_SET(0, &read_set);
|
||||
|
||||
if (delay_secs) {
|
||||
timeout.tv_sec = delay_secs;
|
||||
timeout.tv_usec = 0;
|
||||
}
|
||||
|
||||
err = select(1, &read_set, NULL, NULL, ptimeout);
|
||||
|
||||
if (err == 0)
|
||||
return K_TIMER;
|
||||
|
||||
if (err == -1) {
|
||||
if (errno == EINTR)
|
||||
return K_RESIZE;
|
||||
return K_ERROR;
|
||||
}
|
||||
|
||||
key = SLang_getkey();
|
||||
if (key != K_ESC)
|
||||
return key;
|
||||
|
||||
FD_ZERO(&read_set);
|
||||
FD_SET(0, &read_set);
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 20;
|
||||
err = select(1, &read_set, NULL, NULL, &timeout);
|
||||
if (err == 0)
|
||||
return K_ESC;
|
||||
|
||||
SLang_ungetkey(key);
|
||||
return SLkp_getkey();
|
||||
}
|
||||
|
||||
static void newt_suspend(void *d __used)
|
||||
{
|
||||
newtSuspend();
|
||||
raise(SIGTSTP);
|
||||
newtResume();
|
||||
}
|
||||
|
||||
static void ui__signal(int sig)
|
||||
{
|
||||
ui__exit(false);
|
||||
psignal(sig, "perf");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
int ui__init(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
newtInit();
|
||||
err = SLkp_init();
|
||||
if (err < 0) {
|
||||
pr_err("TUI initialization failed.\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
SLkp_define_keysym((char *)"^(kB)", SL_KEY_UNTAB);
|
||||
|
||||
newtSetSuspendCallback(newt_suspend, NULL);
|
||||
ui_helpline__init();
|
||||
ui_browser__init();
|
||||
|
||||
signal(SIGSEGV, ui__signal);
|
||||
signal(SIGFPE, ui__signal);
|
||||
signal(SIGINT, ui__signal);
|
||||
signal(SIGQUIT, ui__signal);
|
||||
signal(SIGTERM, ui__signal);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
void ui__exit(bool wait_for_ok)
|
||||
{
|
||||
if (wait_for_ok)
|
||||
ui__question_window("Fatal Error",
|
||||
ui_helpline__last_msg,
|
||||
"Press any key...", 0);
|
||||
|
||||
SLtt_set_cursor_visibility(1);
|
||||
SLsmg_refresh();
|
||||
SLsmg_reset_smg();
|
||||
SLang_reset_tty();
|
||||
}
|
||||
Reference in New Issue
Block a user