Messages in this thread | | | From | Namhyung Kim <> | Date | Tue, 27 Dec 2022 12:24:07 -0800 | Subject | Re: [PATCH] perf tui: don't ignore job control |
| |
Hello,
On Mon, Dec 26, 2022 at 11:35 AM Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz> wrote: > > In its infinite wisdom, by default, SLang sets susp undef, > and this can only be un-done by calling SLtty_set_suspend_state(true). > After every SLang_init_tty(). > > Additionally, no provisions are made for maintaining the teletype > attributes across suspend/continue (outside of curses emulation mode(?!), > which provides full support, naturally), so we need to save and restore > the flags ourselves. We need to also re-draw the screen, and raising > SIGWINCH, shockingly, Just Works. > > The correct solution would be to Not Use SLang, but as a stop-gap, > this makes TUI perf report usable. > > Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Cool, this makes Ctrl-Z and then 'fg' work. But it comes with the color for a selected line depending on the timing. Maybe we can reset the color before going to the background?
Thanks, Namhyung
> --- > tools/perf/ui/browsers/annotate.c | 1 + > tools/perf/ui/browsers/hists.c | 2 ++ > tools/perf/ui/browsers/scripts.c | 1 + > tools/perf/ui/tui/setup.c | 19 +++++++++++++++++++ > 4 files changed, 23 insertions(+) > > diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/annotate.c > index c03fa76c02ff..6a4ffbf66c7f 100644 > --- a/tools/perf/ui/browsers/annotate.c > +++ b/tools/perf/ui/browsers/annotate.c > @@ -942,6 +942,7 @@ int hist_entry__tui_annotate(struct hist_entry *he, struct evsel *evsel, > /* reset abort key so that it can get Ctrl-C as a key */ > SLang_reset_tty(); > SLang_init_tty(0, 0, 0); > + SLtty_set_suspend_state(true); > > return map_symbol__tui_annotate(&he->ms, evsel, hbt, opts); > } > diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c > index b72ee6822222..2479e6d42e7c 100644 > --- a/tools/perf/ui/browsers/hists.c > +++ b/tools/perf/ui/browsers/hists.c > @@ -3010,6 +3010,7 @@ static int evsel__hists_browse(struct evsel *evsel, int nr_events, const char *h > /* reset abort key so that it can get Ctrl-C as a key */ > SLang_reset_tty(); > SLang_init_tty(0, 0, 0); > + SLtty_set_suspend_state(true); > > if (min_pcnt) > browser->min_pcnt = min_pcnt; > @@ -3682,6 +3683,7 @@ int block_hists_tui_browse(struct block_hist *bh, struct evsel *evsel, > /* reset abort key so that it can get Ctrl-C as a key */ > SLang_reset_tty(); > SLang_init_tty(0, 0, 0); > + SLtty_set_suspend_state(true); > > memset(&action, 0, sizeof(action)); > > diff --git a/tools/perf/ui/browsers/scripts.c b/tools/perf/ui/browsers/scripts.c > index 47d2c7a8cbe1..50d45054ed6c 100644 > --- a/tools/perf/ui/browsers/scripts.c > +++ b/tools/perf/ui/browsers/scripts.c > @@ -166,6 +166,7 @@ void run_script(char *cmd) > printf("\033[c\033[H\033[J"); > fflush(stdout); > SLang_init_tty(0, 0, 0); > + SLtty_set_suspend_state(true); > SLsmg_refresh(); > } > > diff --git a/tools/perf/ui/tui/setup.c b/tools/perf/ui/tui/setup.c > index a3b8c397c24d..4211a161458a 100644 > --- a/tools/perf/ui/tui/setup.c > +++ b/tools/perf/ui/tui/setup.c > @@ -2,6 +2,7 @@ > #include <signal.h> > #include <stdbool.h> > #include <stdlib.h> > +#include <termios.h> > #include <unistd.h> > #include <linux/kernel.h> > #ifdef HAVE_BACKTRACE_SUPPORT > @@ -122,6 +123,21 @@ static void ui__signal(int sig) > exit(0); > } > > +static void ui__sigcont(int sig) > +{ > + static struct termios tty; > + > + if (sig == SIGTSTP) { > + while (tcgetattr(SLang_TT_Read_FD, &tty) == -1 && errno == EINTR) > + ; > + raise(SIGSTOP); > + } else { > + while (tcsetattr(SLang_TT_Read_FD, TCSADRAIN, &tty) == -1 && errno == EINTR) > + ; > + raise(SIGWINCH); > + } > +} > + > int ui__init(void) > { > int err; > @@ -136,6 +152,7 @@ int ui__init(void) > err = SLang_init_tty(-1, 0, 0); > if (err < 0) > goto out; > + SLtty_set_suspend_state(true); > > err = SLkp_init(); > if (err < 0) { > @@ -150,6 +167,8 @@ int ui__init(void) > signal(SIGINT, ui__signal); > signal(SIGQUIT, ui__signal); > signal(SIGTERM, ui__signal); > + signal(SIGTSTP, ui__sigcont); > + signal(SIGCONT, ui__sigcont); > > perf_error__register(&perf_tui_eops); > > -- > 2.30.2
| |