Commit 871271615108fd58273423d98b7cefe08e6f75a0

Authored by aliguori
1 parent 376253ec

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
Showing 1 changed file with 23 additions and 20 deletions
monitor.c
@@ -67,8 +67,12 @@ typedef struct mon_cmd_t { @@ -67,8 +67,12 @@ typedef struct mon_cmd_t {
67 const char *help; 67 const char *help;
68 } mon_cmd_t; 68 } mon_cmd_t;
69 69
70 -#define MAX_MON 4  
71 -static CharDriverState *monitor_hd[MAX_MON]; 70 +struct Monitor {
  71 + CharDriverState *chr;
  72 + LIST_ENTRY(Monitor) entry;
  73 +};
  74 +
  75 +static LIST_HEAD(mon_list, Monitor) mon_list;
72 static int hide_banner; 76 static int hide_banner;
73 77
74 static const mon_cmd_t mon_cmds[]; 78 static const mon_cmd_t mon_cmds[];
@@ -79,7 +83,7 @@ static int term_outbuf_index; @@ -79,7 +83,7 @@ static int term_outbuf_index;
79 static BlockDriverCompletionFunc *password_completion_cb; 83 static BlockDriverCompletionFunc *password_completion_cb;
80 static void *password_opaque; 84 static void *password_opaque;
81 85
82 -Monitor *cur_mon; 86 +Monitor *cur_mon = NULL;
83 87
84 static void monitor_start_input(void); 88 static void monitor_start_input(void);
85 89
@@ -93,11 +97,13 @@ static void monitor_read_password(Monitor *mon, ReadLineFunc *readline_func, @@ -93,11 +97,13 @@ static void monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
93 97
94 void monitor_flush(Monitor *mon) 98 void monitor_flush(Monitor *mon)
95 { 99 {
96 - int i; 100 + Monitor *m;
  101 +
97 if (term_outbuf_index > 0) { 102 if (term_outbuf_index > 0) {
98 - for (i = 0; i < MAX_MON; i++)  
99 - if (monitor_hd[i] && monitor_hd[i]->focus == 0)  
100 - qemu_chr_write(monitor_hd[i], term_outbuf, term_outbuf_index); 103 + LIST_FOREACH(m, &mon_list, entry) {
  104 + if (m->chr->focus == 0)
  105 + qemu_chr_write(m->chr, term_outbuf, term_outbuf_index);
  106 + }
101 term_outbuf_index = 0; 107 term_outbuf_index = 0;
102 } 108 }
103 } 109 }
@@ -2921,27 +2927,24 @@ static int is_first_init = 1; @@ -2921,27 +2927,24 @@ static int is_first_init = 1;
2921 2927
2922 void monitor_init(CharDriverState *chr, int show_banner) 2928 void monitor_init(CharDriverState *chr, int show_banner)
2923 { 2929 {
2924 - int i; 2930 + Monitor *mon;
2925 2931
2926 if (is_first_init) { 2932 if (is_first_init) {
2927 key_timer = qemu_new_timer(vm_clock, release_keys, NULL); 2933 key_timer = qemu_new_timer(vm_clock, release_keys, NULL);
2928 - if (!key_timer)  
2929 - return;  
2930 - for (i = 0; i < MAX_MON; i++) {  
2931 - monitor_hd[i] = NULL;  
2932 - }  
2933 is_first_init = 0; 2934 is_first_init = 0;
2934 } 2935 }
2935 - for (i = 0; i < MAX_MON; i++) {  
2936 - if (monitor_hd[i] == NULL) {  
2937 - monitor_hd[i] = chr;  
2938 - break;  
2939 - }  
2940 - } 2936 +
  2937 + mon = qemu_mallocz(sizeof(*mon));
2941 2938
2942 hide_banner = !show_banner; 2939 hide_banner = !show_banner;
2943 2940
2944 - qemu_chr_add_handlers(chr, term_can_read, term_read, term_event, cur_mon); 2941 + mon->chr = chr;
  2942 +
  2943 + qemu_chr_add_handlers(chr, term_can_read, term_read, term_event, mon);
  2944 +
  2945 + LIST_INSERT_HEAD(&mon_list, mon, entry);
  2946 + if (!cur_mon)
  2947 + cur_mon = mon;
2945 2948
2946 readline_start("", 0, monitor_command_cb, NULL); 2949 readline_start("", 0, monitor_command_cb, NULL);
2947 } 2950 }