6 virtual char const *get_mode_str() const { return "[std mode]"; }
7 virtual void next_mode() {}
8 virtual void next_sort() {}
9 virtual void *get_head() const = 0;
10 virtual int show_item(char *buffer, int max, void *item) const = 0;
11 virtual char const *show_head() const = 0;
12 virtual int seek(int cnt, void **item) = 0;
13 virtual bool enter_item(void * /*item*/) const { return true; }
14 virtual void *follow_link(void *a) { return a; }
15 virtual bool handle_key(void * /*item*/, int /*keycode*/) { return false; }
16 virtual void *parent(void * /*item*/) { return 0; }
17 virtual void *get_valid(void *a) { return a; }
26 // ---------------------------------------------------------------------------
35 #include "jdb_screen.h"
36 #include "kernel_console.h"
45 : _start(0), _current(0)
48 // set _t_start element of list
51 Jdb_list::set_start(void *start)
56 // _t_start-- if possible
60 { return seek(-1, &_start); }
62 // _t_start++ if possible
68 return seek(1, &_start);
74 iter(+Jdb_screen::height()-2, &_t_start);
75 iter(-Jdb_screen::height()+3, &_t_start);
80 // _t_start -= 24 if possible
84 { return seek(-Jdb_screen::height()+2, &_start); }
86 // _t_start += 24 if possible
91 int fwd = seek(Jdb_screen::height()-2, &_last);
93 return seek(fwd, &_start);
99 iter(+Jdb_screen::height()*2-5, &_t_start);
100 iter(-Jdb_screen::height() +3, &_t_start);
101 return t != _t_start;
105 // _t_start = first element of list
108 Jdb_list::goto_home()
109 { return seek(-99999, &_start); }
111 // _t_start = last element of list
115 { return seek(99999, &_start); }
117 Thread *t = _t_start;
118 iter(+9999, &_t_start);
119 iter(-Jdb_screen::height()+2, &_t_start);
120 return t != _t_start;
124 // search index of t_search starting from _t_start
127 Jdb_list::lookup_in_visible_area(void *search)
132 for (i=0, t = _start; i < Jdb_screen::height()-3; ++i)
143 // get y'th element of thread list starting from _t_start
146 Jdb_list::index(int y)
157 Jdb_list::show_line(void *i)
159 static char buffer[256];
160 Kconsole::console()->getchar_chance();
163 while ((p = parent(p)))
169 pos += show_item(buffer + pos, sizeof(buffer) - pos, i);
171 printf("%.*s\033[K\n", min((int)Jdb_screen::width(), pos), buffer);
174 // show complete page using show callback function
177 Jdb_list::page_show()
181 for (i = 0; i < Jdb_screen::height()-3; ++i)
197 // show complete list using show callback function
200 Jdb_list::complete_show()
204 for (i = 0; ; ++i, seek(1, &t))
217 Jdb_module::Action_code
218 Jdb_thread_list::action(int cmd, void *&argbuf, char const *&fmt, int &)
220 static char const *const cpu_fmt = " cpu=%i\n";
221 static char const *const nfmt = "\n";
224 if (fmt != cpu_fmt && fmt != nfmt)
236 Thread *t = Jdb::get_current_active();
239 case 'r': cpu = 0; list_threads(t, 'r'); break;
240 case 'p': list_threads(t, 'p'); break;
242 if (Cpu::online(cpu))
243 list_threads(Jdb::get_thread(cpu), 'r');
245 printf("\nCPU %u is not online!\n", cpu);
248 case 't': Jdb::execute_command("lt"); break; // other module
253 Console *gzip = Kconsole::console()->find_console(Console::GZIP);
256 Thread *t = Jdb::get_current_active();
257 gzip->state(gzip->state() | Console::OUTENABLED);
259 Jdb_thread_list::init('p', t);
260 Jdb_thread_list::set_start(t);
261 Jdb_thread_list::goto_home();
262 Jdb_thread_list::complete_show(list_threads_show_thread);
264 gzip->state(gzip->state() & ~Console::OUTENABLED);
267 puts(" gzip module not available");
277 Jdb_list::show_header()
280 printf("%.*s\033[K\n", Jdb_screen::width(), show_head());
309 // set y to position of t_current in current displayed list
310 y = lookup_in_visible_area(_current);
317 for (bool resync=false; !resync;)
322 // clear rest of screen (if where less than 24 lines)
323 for (unsigned i = y_max; i < Jdb_screen::height()-3; ++i)
326 Jdb::printf_statline("xxxx",
327 "<Space>=mode <Tab>=link <CR>=select",
328 "%-15s", get_mode_str());
331 for (bool redraw=false; !redraw; )
334 switch (int c=Jdb_core::getchar())
341 redraw = line_back();
343 case KEY_CURSOR_DOWN:
348 redraw = line_forw();
352 if (!(redraw = page_back()))
357 if (!(redraw = page_forw()))
360 case KEY_CURSOR_HOME:
362 redraw = goto_home();
370 case 's': // switch sort
376 case ' ': // switch mode
379 _current = get_valid(_current);
380 _start = get_valid(_start);
384 case KEY_TAB: // go to associated object
386 t = follow_link(_current);
396 if (!enter_item(_current))
402 Jdb::abort_command();
406 if (!handle_key(_current, c) && Jdb::is_toplevel_cmd(c))