diff options
author | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2009-03-05 23:01:29 +0000 |
---|---|---|
committer | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2009-03-05 23:01:29 +0000 |
commit | 871271615108fd58273423d98b7cefe08e6f75a0 (patch) | |
tree | 8837f5e8847e4ae38d2bcfac47191da1bc6a726e | |
parent | 376253ece484b7dc86f215641dca47c3c88f38d1 (diff) | |
download | qemu-871271615108fd58273423d98b7cefe08e6f75a0.tar.gz qemu-871271615108fd58273423d98b7cefe08e6f75a0.tar.bz2 qemu-871271615108fd58273423d98b7cefe08e6f75a0.zip |
monitor: Rework terminal management (Jan Kiszka)
Remove the static MAX_MON limit by managing monitor terminals in a
linked list.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6712 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r-- | monitor.c | 43 |
1 files changed, 23 insertions, 20 deletions
@@ -67,8 +67,12 @@ typedef struct mon_cmd_t { const char *help; } mon_cmd_t; -#define MAX_MON 4 -static CharDriverState *monitor_hd[MAX_MON]; +struct Monitor { + CharDriverState *chr; + LIST_ENTRY(Monitor) entry; +}; + +static LIST_HEAD(mon_list, Monitor) mon_list; static int hide_banner; static const mon_cmd_t mon_cmds[]; @@ -79,7 +83,7 @@ static int term_outbuf_index; static BlockDriverCompletionFunc *password_completion_cb; static void *password_opaque; -Monitor *cur_mon; +Monitor *cur_mon = NULL; static void monitor_start_input(void); @@ -93,11 +97,13 @@ static void monitor_read_password(Monitor *mon, ReadLineFunc *readline_func, void monitor_flush(Monitor *mon) { - int i; + Monitor *m; + if (term_outbuf_index > 0) { - for (i = 0; i < MAX_MON; i++) - if (monitor_hd[i] && monitor_hd[i]->focus == 0) - qemu_chr_write(monitor_hd[i], term_outbuf, term_outbuf_index); + LIST_FOREACH(m, &mon_list, entry) { + if (m->chr->focus == 0) + qemu_chr_write(m->chr, term_outbuf, term_outbuf_index); + } term_outbuf_index = 0; } } @@ -2921,27 +2927,24 @@ static int is_first_init = 1; void monitor_init(CharDriverState *chr, int show_banner) { - int i; + Monitor *mon; if (is_first_init) { key_timer = qemu_new_timer(vm_clock, release_keys, NULL); - if (!key_timer) - return; - for (i = 0; i < MAX_MON; i++) { - monitor_hd[i] = NULL; - } is_first_init = 0; } - for (i = 0; i < MAX_MON; i++) { - if (monitor_hd[i] == NULL) { - monitor_hd[i] = chr; - break; - } - } + + mon = qemu_mallocz(sizeof(*mon)); hide_banner = !show_banner; - qemu_chr_add_handlers(chr, term_can_read, term_read, term_event, cur_mon); + mon->chr = chr; + + qemu_chr_add_handlers(chr, term_can_read, term_read, term_event, mon); + + LIST_INSERT_HEAD(&mon_list, mon, entry); + if (!cur_mon) + cur_mon = mon; readline_start("", 0, monitor_command_cb, NULL); } |