diff options
Diffstat (limited to 'tools/console')
-rw-r--r-- | tools/console/daemon/io.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c index f09d63a304..48fe1519d5 100644 --- a/tools/console/daemon/io.c +++ b/tools/console/daemon/io.c @@ -84,6 +84,7 @@ struct domain { int slave_fd; int log_fd; bool is_dead; + unsigned last_seen; struct buffer buffer; struct domain *next; char *conspath; @@ -727,12 +728,16 @@ static void shutdown_domain(struct domain *d) d->xce_handle = NULL; } +static unsigned enum_pass = 0; + void enum_domains(void) { int domid = 1; xc_dominfo_t dominfo; struct domain *dom; + enum_pass++; + while (xc_domain_getinfo(xc, domid, 1, &dominfo) == 1) { dom = lookup_domain(dominfo.domid); if (dominfo.dying) { @@ -740,8 +745,10 @@ void enum_domains(void) shutdown_domain(dom); } else { if (dom == NULL) - create_domain(dominfo.domid); + dom = create_domain(dominfo.domid); } + if (dom) + dom->last_seen = enum_pass; domid = dominfo.domid + 1; } } @@ -1069,6 +1076,9 @@ void handle_io(void) &writefds)) handle_tty_write(d); + if (d->last_seen != enum_pass) + shutdown_domain(d); + if (d->is_dead) cleanup_domain(d); } |