Re: [PATCH 1/5] perf ui: Introduce struct perf_helpline

2012-08-15 Thread Arnaldo Carvalho de Melo
Em Wed, Aug 15, 2012 at 11:57:31PM +0900, Namhyung Kim escreveu:
> Add struct perf_helpline in order to provide flexible implementation
> of helpline APIs. And convert existing TUI implementation to use it.

I advise not to use struct perf_helpline but struct ui_helpline, as it
is just user interface, not exactly tied to perf, it is just its first
user.

We don't need to bend over backwardws trying to create yet another UI
widget set, but there is no need to use the "perf_" namespace on it, I
think.

- Arnaldo
 
> Signed-off-by: Namhyung Kim 
> ---
>  tools/perf/Makefile  |5 ++--
>  tools/perf/ui/helpline.c |   56 ++--
>  tools/perf/ui/helpline.h |   10 +++-
>  tools/perf/ui/tui/helpline.c |   58 
> ++
>  4 files changed, 89 insertions(+), 40 deletions(-)
>  create mode 100644 tools/perf/ui/tui/helpline.c
> 
> diff --git a/tools/perf/Makefile b/tools/perf/Makefile
> index e457afa04b59..483fb69fa4ae 100644
> --- a/tools/perf/Makefile
> +++ b/tools/perf/Makefile
> @@ -335,6 +335,7 @@ LIB_H += util/rblist.h
>  LIB_H += util/intlist.h
>  LIB_H += util/perf_regs.h
>  LIB_H += util/unwind.h
> +LIB_H += ui/helpline.h
>  
>  LIB_OBJS += $(OUTPUT)util/abspath.o
>  LIB_OBJS += $(OUTPUT)util/alias.o
> @@ -402,6 +403,7 @@ LIB_OBJS += $(OUTPUT)util/cgroup.o
>  LIB_OBJS += $(OUTPUT)util/target.o
>  LIB_OBJS += $(OUTPUT)util/rblist.o
>  LIB_OBJS += $(OUTPUT)util/intlist.o
> +LIB_OBJS += $(OUTPUT)ui/helpline.o
>  
>  BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o
>  
> @@ -567,14 +569,13 @@ else
>   LIB_OBJS += $(OUTPUT)ui/browsers/annotate.o
>   LIB_OBJS += $(OUTPUT)ui/browsers/hists.o
>   LIB_OBJS += $(OUTPUT)ui/browsers/map.o
> - LIB_OBJS += $(OUTPUT)ui/helpline.o
>   LIB_OBJS += $(OUTPUT)ui/progress.o
>   LIB_OBJS += $(OUTPUT)ui/util.o
>   LIB_OBJS += $(OUTPUT)ui/tui/setup.o
>   LIB_OBJS += $(OUTPUT)ui/tui/util.o
> + LIB_OBJS += $(OUTPUT)ui/tui/helpline.o
>   LIB_H += ui/browser.h
>   LIB_H += ui/browsers/map.h
> - LIB_H += ui/helpline.h
>   LIB_H += ui/keysyms.h
>   LIB_H += ui/libslang.h
>   LIB_H += ui/progress.h
> diff --git a/tools/perf/ui/helpline.c b/tools/perf/ui/helpline.c
> index 2f950c2641c8..ac52dd0af49e 100644
> --- a/tools/perf/ui/helpline.c
> +++ b/tools/perf/ui/helpline.c
> @@ -5,23 +5,32 @@
>  #include "../debug.h"
>  #include "helpline.h"
>  #include "ui.h"
> -#include "libslang.h"
>  
> -void ui_helpline__pop(void)
> +char ui_helpline__current[512];
> +
> +static void perf_helpline__pop(void)
>  {
>  }
>  
> -char ui_helpline__current[512];
> +static void perf_helpline__push(const char *msg __used)
> +{
> +}
>  
> -void ui_helpline__push(const char *msg)
> +static struct perf_helpline default_helpline_fns = {
> + .pop= perf_helpline__pop,
> + .push   = perf_helpline__push,
> +};
> +
> +struct perf_helpline *helpline_fns = _helpline_fns;
> +
> +void ui_helpline__pop(void)
>  {
> - const size_t sz = sizeof(ui_helpline__current);
> + helpline_fns->pop();
> +}
>  
> - SLsmg_gotorc(SLtt_Screen_Rows - 1, 0);
> - SLsmg_set_color(0);
> - SLsmg_write_nstring((char *)msg, SLtt_Screen_Cols);
> - SLsmg_refresh();
> - strncpy(ui_helpline__current, msg, sz)[sz - 1] = '\0';
> +void ui_helpline__push(const char *msg)
> +{
> + helpline_fns->push(msg);
>  }
>  
>  void ui_helpline__vpush(const char *fmt, va_list ap)
> @@ -50,30 +59,3 @@ void ui_helpline__puts(const char *msg)
>   ui_helpline__pop();
>   ui_helpline__push(msg);
>  }
> -
> -void ui_helpline__init(void)
> -{
> - ui_helpline__puts(" ");
> -}
> -
> -char ui_helpline__last_msg[1024];
> -
> -int ui_helpline__show_help(const char *format, va_list ap)
> -{
> - int ret;
> - static int backlog;
> -
> - pthread_mutex_lock(__lock);
> - ret = vscnprintf(ui_helpline__last_msg + backlog,
> - sizeof(ui_helpline__last_msg) - backlog, format, ap);
> - backlog += ret;
> -
> - if (ui_helpline__last_msg[backlog - 1] == '\n') {
> - ui_helpline__puts(ui_helpline__last_msg);
> - SLsmg_refresh();
> - backlog = 0;
> - }
> - pthread_mutex_unlock(__lock);
> -
> - return ret;
> -}
> diff --git a/tools/perf/ui/helpline.h b/tools/perf/ui/helpline.h
> index 7bab6b34e35e..eee8e2ff51d8 100644
> --- a/tools/perf/ui/helpline.h
> +++ b/tools/perf/ui/helpline.h
> @@ -4,13 +4,21 @@
>  #include 
>  #include 
>  
> +struct perf_helpline {
> + void (*pop)(void);
> + void (*push)(const char *msg);
> +};
> +
> +extern struct perf_helpline *helpline_fns;
> +
>  void ui_helpline__init(void);
> +
>  void ui_helpline__pop(void);
>  void ui_helpline__push(const char *msg);
>  void ui_helpline__vpush(const char *fmt, va_list ap);
>  void ui_helpline__fpush(const char *fmt, 

[PATCH 1/5] perf ui: Introduce struct perf_helpline

2012-08-15 Thread Namhyung Kim
Add struct perf_helpline in order to provide flexible implementation
of helpline APIs. And convert existing TUI implementation to use it.

Signed-off-by: Namhyung Kim 
---
 tools/perf/Makefile  |5 ++--
 tools/perf/ui/helpline.c |   56 ++--
 tools/perf/ui/helpline.h |   10 +++-
 tools/perf/ui/tui/helpline.c |   58 ++
 4 files changed, 89 insertions(+), 40 deletions(-)
 create mode 100644 tools/perf/ui/tui/helpline.c

diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index e457afa04b59..483fb69fa4ae 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -335,6 +335,7 @@ LIB_H += util/rblist.h
 LIB_H += util/intlist.h
 LIB_H += util/perf_regs.h
 LIB_H += util/unwind.h
+LIB_H += ui/helpline.h
 
 LIB_OBJS += $(OUTPUT)util/abspath.o
 LIB_OBJS += $(OUTPUT)util/alias.o
@@ -402,6 +403,7 @@ LIB_OBJS += $(OUTPUT)util/cgroup.o
 LIB_OBJS += $(OUTPUT)util/target.o
 LIB_OBJS += $(OUTPUT)util/rblist.o
 LIB_OBJS += $(OUTPUT)util/intlist.o
+LIB_OBJS += $(OUTPUT)ui/helpline.o
 
 BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o
 
@@ -567,14 +569,13 @@ else
LIB_OBJS += $(OUTPUT)ui/browsers/annotate.o
LIB_OBJS += $(OUTPUT)ui/browsers/hists.o
LIB_OBJS += $(OUTPUT)ui/browsers/map.o
-   LIB_OBJS += $(OUTPUT)ui/helpline.o
LIB_OBJS += $(OUTPUT)ui/progress.o
LIB_OBJS += $(OUTPUT)ui/util.o
LIB_OBJS += $(OUTPUT)ui/tui/setup.o
LIB_OBJS += $(OUTPUT)ui/tui/util.o
+   LIB_OBJS += $(OUTPUT)ui/tui/helpline.o
LIB_H += ui/browser.h
LIB_H += ui/browsers/map.h
-   LIB_H += ui/helpline.h
LIB_H += ui/keysyms.h
LIB_H += ui/libslang.h
LIB_H += ui/progress.h
diff --git a/tools/perf/ui/helpline.c b/tools/perf/ui/helpline.c
index 2f950c2641c8..ac52dd0af49e 100644
--- a/tools/perf/ui/helpline.c
+++ b/tools/perf/ui/helpline.c
@@ -5,23 +5,32 @@
 #include "../debug.h"
 #include "helpline.h"
 #include "ui.h"
-#include "libslang.h"
 
-void ui_helpline__pop(void)
+char ui_helpline__current[512];
+
+static void perf_helpline__pop(void)
 {
 }
 
-char ui_helpline__current[512];
+static void perf_helpline__push(const char *msg __used)
+{
+}
 
-void ui_helpline__push(const char *msg)
+static struct perf_helpline default_helpline_fns = {
+   .pop= perf_helpline__pop,
+   .push   = perf_helpline__push,
+};
+
+struct perf_helpline *helpline_fns = _helpline_fns;
+
+void ui_helpline__pop(void)
 {
-   const size_t sz = sizeof(ui_helpline__current);
+   helpline_fns->pop();
+}
 
-   SLsmg_gotorc(SLtt_Screen_Rows - 1, 0);
-   SLsmg_set_color(0);
-   SLsmg_write_nstring((char *)msg, SLtt_Screen_Cols);
-   SLsmg_refresh();
-   strncpy(ui_helpline__current, msg, sz)[sz - 1] = '\0';
+void ui_helpline__push(const char *msg)
+{
+   helpline_fns->push(msg);
 }
 
 void ui_helpline__vpush(const char *fmt, va_list ap)
@@ -50,30 +59,3 @@ void ui_helpline__puts(const char *msg)
ui_helpline__pop();
ui_helpline__push(msg);
 }
-
-void ui_helpline__init(void)
-{
-   ui_helpline__puts(" ");
-}
-
-char ui_helpline__last_msg[1024];
-
-int ui_helpline__show_help(const char *format, va_list ap)
-{
-   int ret;
-   static int backlog;
-
-   pthread_mutex_lock(__lock);
-   ret = vscnprintf(ui_helpline__last_msg + backlog,
-   sizeof(ui_helpline__last_msg) - backlog, format, ap);
-   backlog += ret;
-
-   if (ui_helpline__last_msg[backlog - 1] == '\n') {
-   ui_helpline__puts(ui_helpline__last_msg);
-   SLsmg_refresh();
-   backlog = 0;
-   }
-   pthread_mutex_unlock(__lock);
-
-   return ret;
-}
diff --git a/tools/perf/ui/helpline.h b/tools/perf/ui/helpline.h
index 7bab6b34e35e..eee8e2ff51d8 100644
--- a/tools/perf/ui/helpline.h
+++ b/tools/perf/ui/helpline.h
@@ -4,13 +4,21 @@
 #include 
 #include 
 
+struct perf_helpline {
+   void (*pop)(void);
+   void (*push)(const char *msg);
+};
+
+extern struct perf_helpline *helpline_fns;
+
 void ui_helpline__init(void);
+
 void ui_helpline__pop(void);
 void ui_helpline__push(const char *msg);
 void ui_helpline__vpush(const char *fmt, va_list ap);
 void ui_helpline__fpush(const char *fmt, ...);
 void ui_helpline__puts(const char *msg);
 
-extern char ui_helpline__current[];
+extern char ui_helpline__current[512];
 
 #endif /* _PERF_UI_HELPLINE_H_ */
diff --git a/tools/perf/ui/tui/helpline.c b/tools/perf/ui/tui/helpline.c
new file mode 100644
index ..b63a9326d06b
--- /dev/null
+++ b/tools/perf/ui/tui/helpline.c
@@ -0,0 +1,58 @@
+#include 
+#include 
+#include 
+#include 
+
+#include "../../util/debug.h"
+#include "../helpline.h"
+#include "../ui.h"
+#include "../libslang.h"
+
+
+static void tui_helpline__pop(void)
+{
+}
+
+static void 

[PATCH 1/5] perf ui: Introduce struct perf_helpline

2012-08-15 Thread Namhyung Kim
Add struct perf_helpline in order to provide flexible implementation
of helpline APIs. And convert existing TUI implementation to use it.

Signed-off-by: Namhyung Kim namhy...@kernel.org
---
 tools/perf/Makefile  |5 ++--
 tools/perf/ui/helpline.c |   56 ++--
 tools/perf/ui/helpline.h |   10 +++-
 tools/perf/ui/tui/helpline.c |   58 ++
 4 files changed, 89 insertions(+), 40 deletions(-)
 create mode 100644 tools/perf/ui/tui/helpline.c

diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index e457afa04b59..483fb69fa4ae 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -335,6 +335,7 @@ LIB_H += util/rblist.h
 LIB_H += util/intlist.h
 LIB_H += util/perf_regs.h
 LIB_H += util/unwind.h
+LIB_H += ui/helpline.h
 
 LIB_OBJS += $(OUTPUT)util/abspath.o
 LIB_OBJS += $(OUTPUT)util/alias.o
@@ -402,6 +403,7 @@ LIB_OBJS += $(OUTPUT)util/cgroup.o
 LIB_OBJS += $(OUTPUT)util/target.o
 LIB_OBJS += $(OUTPUT)util/rblist.o
 LIB_OBJS += $(OUTPUT)util/intlist.o
+LIB_OBJS += $(OUTPUT)ui/helpline.o
 
 BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o
 
@@ -567,14 +569,13 @@ else
LIB_OBJS += $(OUTPUT)ui/browsers/annotate.o
LIB_OBJS += $(OUTPUT)ui/browsers/hists.o
LIB_OBJS += $(OUTPUT)ui/browsers/map.o
-   LIB_OBJS += $(OUTPUT)ui/helpline.o
LIB_OBJS += $(OUTPUT)ui/progress.o
LIB_OBJS += $(OUTPUT)ui/util.o
LIB_OBJS += $(OUTPUT)ui/tui/setup.o
LIB_OBJS += $(OUTPUT)ui/tui/util.o
+   LIB_OBJS += $(OUTPUT)ui/tui/helpline.o
LIB_H += ui/browser.h
LIB_H += ui/browsers/map.h
-   LIB_H += ui/helpline.h
LIB_H += ui/keysyms.h
LIB_H += ui/libslang.h
LIB_H += ui/progress.h
diff --git a/tools/perf/ui/helpline.c b/tools/perf/ui/helpline.c
index 2f950c2641c8..ac52dd0af49e 100644
--- a/tools/perf/ui/helpline.c
+++ b/tools/perf/ui/helpline.c
@@ -5,23 +5,32 @@
 #include ../debug.h
 #include helpline.h
 #include ui.h
-#include libslang.h
 
-void ui_helpline__pop(void)
+char ui_helpline__current[512];
+
+static void perf_helpline__pop(void)
 {
 }
 
-char ui_helpline__current[512];
+static void perf_helpline__push(const char *msg __used)
+{
+}
 
-void ui_helpline__push(const char *msg)
+static struct perf_helpline default_helpline_fns = {
+   .pop= perf_helpline__pop,
+   .push   = perf_helpline__push,
+};
+
+struct perf_helpline *helpline_fns = default_helpline_fns;
+
+void ui_helpline__pop(void)
 {
-   const size_t sz = sizeof(ui_helpline__current);
+   helpline_fns-pop();
+}
 
-   SLsmg_gotorc(SLtt_Screen_Rows - 1, 0);
-   SLsmg_set_color(0);
-   SLsmg_write_nstring((char *)msg, SLtt_Screen_Cols);
-   SLsmg_refresh();
-   strncpy(ui_helpline__current, msg, sz)[sz - 1] = '\0';
+void ui_helpline__push(const char *msg)
+{
+   helpline_fns-push(msg);
 }
 
 void ui_helpline__vpush(const char *fmt, va_list ap)
@@ -50,30 +59,3 @@ void ui_helpline__puts(const char *msg)
ui_helpline__pop();
ui_helpline__push(msg);
 }
-
-void ui_helpline__init(void)
-{
-   ui_helpline__puts( );
-}
-
-char ui_helpline__last_msg[1024];
-
-int ui_helpline__show_help(const char *format, va_list ap)
-{
-   int ret;
-   static int backlog;
-
-   pthread_mutex_lock(ui__lock);
-   ret = vscnprintf(ui_helpline__last_msg + backlog,
-   sizeof(ui_helpline__last_msg) - backlog, format, ap);
-   backlog += ret;
-
-   if (ui_helpline__last_msg[backlog - 1] == '\n') {
-   ui_helpline__puts(ui_helpline__last_msg);
-   SLsmg_refresh();
-   backlog = 0;
-   }
-   pthread_mutex_unlock(ui__lock);
-
-   return ret;
-}
diff --git a/tools/perf/ui/helpline.h b/tools/perf/ui/helpline.h
index 7bab6b34e35e..eee8e2ff51d8 100644
--- a/tools/perf/ui/helpline.h
+++ b/tools/perf/ui/helpline.h
@@ -4,13 +4,21 @@
 #include stdio.h
 #include stdarg.h
 
+struct perf_helpline {
+   void (*pop)(void);
+   void (*push)(const char *msg);
+};
+
+extern struct perf_helpline *helpline_fns;
+
 void ui_helpline__init(void);
+
 void ui_helpline__pop(void);
 void ui_helpline__push(const char *msg);
 void ui_helpline__vpush(const char *fmt, va_list ap);
 void ui_helpline__fpush(const char *fmt, ...);
 void ui_helpline__puts(const char *msg);
 
-extern char ui_helpline__current[];
+extern char ui_helpline__current[512];
 
 #endif /* _PERF_UI_HELPLINE_H_ */
diff --git a/tools/perf/ui/tui/helpline.c b/tools/perf/ui/tui/helpline.c
new file mode 100644
index ..b63a9326d06b
--- /dev/null
+++ b/tools/perf/ui/tui/helpline.c
@@ -0,0 +1,58 @@
+#include stdio.h
+#include stdlib.h
+#include string.h
+#include pthread.h
+
+#include ../../util/debug.h
+#include ../helpline.h
+#include ../ui.h
+#include ../libslang.h
+
+
+static void 

Re: [PATCH 1/5] perf ui: Introduce struct perf_helpline

2012-08-15 Thread Arnaldo Carvalho de Melo
Em Wed, Aug 15, 2012 at 11:57:31PM +0900, Namhyung Kim escreveu:
 Add struct perf_helpline in order to provide flexible implementation
 of helpline APIs. And convert existing TUI implementation to use it.

I advise not to use struct perf_helpline but struct ui_helpline, as it
is just user interface, not exactly tied to perf, it is just its first
user.

We don't need to bend over backwardws trying to create yet another UI
widget set, but there is no need to use the perf_ namespace on it, I
think.

- Arnaldo
 
 Signed-off-by: Namhyung Kim namhy...@kernel.org
 ---
  tools/perf/Makefile  |5 ++--
  tools/perf/ui/helpline.c |   56 ++--
  tools/perf/ui/helpline.h |   10 +++-
  tools/perf/ui/tui/helpline.c |   58 
 ++
  4 files changed, 89 insertions(+), 40 deletions(-)
  create mode 100644 tools/perf/ui/tui/helpline.c
 
 diff --git a/tools/perf/Makefile b/tools/perf/Makefile
 index e457afa04b59..483fb69fa4ae 100644
 --- a/tools/perf/Makefile
 +++ b/tools/perf/Makefile
 @@ -335,6 +335,7 @@ LIB_H += util/rblist.h
  LIB_H += util/intlist.h
  LIB_H += util/perf_regs.h
  LIB_H += util/unwind.h
 +LIB_H += ui/helpline.h
  
  LIB_OBJS += $(OUTPUT)util/abspath.o
  LIB_OBJS += $(OUTPUT)util/alias.o
 @@ -402,6 +403,7 @@ LIB_OBJS += $(OUTPUT)util/cgroup.o
  LIB_OBJS += $(OUTPUT)util/target.o
  LIB_OBJS += $(OUTPUT)util/rblist.o
  LIB_OBJS += $(OUTPUT)util/intlist.o
 +LIB_OBJS += $(OUTPUT)ui/helpline.o
  
  BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o
  
 @@ -567,14 +569,13 @@ else
   LIB_OBJS += $(OUTPUT)ui/browsers/annotate.o
   LIB_OBJS += $(OUTPUT)ui/browsers/hists.o
   LIB_OBJS += $(OUTPUT)ui/browsers/map.o
 - LIB_OBJS += $(OUTPUT)ui/helpline.o
   LIB_OBJS += $(OUTPUT)ui/progress.o
   LIB_OBJS += $(OUTPUT)ui/util.o
   LIB_OBJS += $(OUTPUT)ui/tui/setup.o
   LIB_OBJS += $(OUTPUT)ui/tui/util.o
 + LIB_OBJS += $(OUTPUT)ui/tui/helpline.o
   LIB_H += ui/browser.h
   LIB_H += ui/browsers/map.h
 - LIB_H += ui/helpline.h
   LIB_H += ui/keysyms.h
   LIB_H += ui/libslang.h
   LIB_H += ui/progress.h
 diff --git a/tools/perf/ui/helpline.c b/tools/perf/ui/helpline.c
 index 2f950c2641c8..ac52dd0af49e 100644
 --- a/tools/perf/ui/helpline.c
 +++ b/tools/perf/ui/helpline.c
 @@ -5,23 +5,32 @@
  #include ../debug.h
  #include helpline.h
  #include ui.h
 -#include libslang.h
  
 -void ui_helpline__pop(void)
 +char ui_helpline__current[512];
 +
 +static void perf_helpline__pop(void)
  {
  }
  
 -char ui_helpline__current[512];
 +static void perf_helpline__push(const char *msg __used)
 +{
 +}
  
 -void ui_helpline__push(const char *msg)
 +static struct perf_helpline default_helpline_fns = {
 + .pop= perf_helpline__pop,
 + .push   = perf_helpline__push,
 +};
 +
 +struct perf_helpline *helpline_fns = default_helpline_fns;
 +
 +void ui_helpline__pop(void)
  {
 - const size_t sz = sizeof(ui_helpline__current);
 + helpline_fns-pop();
 +}
  
 - SLsmg_gotorc(SLtt_Screen_Rows - 1, 0);
 - SLsmg_set_color(0);
 - SLsmg_write_nstring((char *)msg, SLtt_Screen_Cols);
 - SLsmg_refresh();
 - strncpy(ui_helpline__current, msg, sz)[sz - 1] = '\0';
 +void ui_helpline__push(const char *msg)
 +{
 + helpline_fns-push(msg);
  }
  
  void ui_helpline__vpush(const char *fmt, va_list ap)
 @@ -50,30 +59,3 @@ void ui_helpline__puts(const char *msg)
   ui_helpline__pop();
   ui_helpline__push(msg);
  }
 -
 -void ui_helpline__init(void)
 -{
 - ui_helpline__puts( );
 -}
 -
 -char ui_helpline__last_msg[1024];
 -
 -int ui_helpline__show_help(const char *format, va_list ap)
 -{
 - int ret;
 - static int backlog;
 -
 - pthread_mutex_lock(ui__lock);
 - ret = vscnprintf(ui_helpline__last_msg + backlog,
 - sizeof(ui_helpline__last_msg) - backlog, format, ap);
 - backlog += ret;
 -
 - if (ui_helpline__last_msg[backlog - 1] == '\n') {
 - ui_helpline__puts(ui_helpline__last_msg);
 - SLsmg_refresh();
 - backlog = 0;
 - }
 - pthread_mutex_unlock(ui__lock);
 -
 - return ret;
 -}
 diff --git a/tools/perf/ui/helpline.h b/tools/perf/ui/helpline.h
 index 7bab6b34e35e..eee8e2ff51d8 100644
 --- a/tools/perf/ui/helpline.h
 +++ b/tools/perf/ui/helpline.h
 @@ -4,13 +4,21 @@
  #include stdio.h
  #include stdarg.h
  
 +struct perf_helpline {
 + void (*pop)(void);
 + void (*push)(const char *msg);
 +};
 +
 +extern struct perf_helpline *helpline_fns;
 +
  void ui_helpline__init(void);
 +
  void ui_helpline__pop(void);
  void ui_helpline__push(const char *msg);
  void ui_helpline__vpush(const char *fmt, va_list ap);
  void ui_helpline__fpush(const char *fmt, ...);
  void ui_helpline__puts(const char *msg);
  
 -extern char ui_helpline__current[];
 +extern char