diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/python/xen/xend/XendCheckpoint.py | 66 |
1 files changed, 39 insertions, 27 deletions
diff --git a/tools/python/xen/xend/XendCheckpoint.py b/tools/python/xen/xend/XendCheckpoint.py index 144cd134ef..ab8ba6fb4e 100644 --- a/tools/python/xen/xend/XendCheckpoint.py +++ b/tools/python/xen/xend/XendCheckpoint.py @@ -116,6 +116,7 @@ def restore(xd, fd): assert dominfo.store_channel assert dominfo.console_channel + assert dominfo.getDomainPath() try: l = read_exact(fd, sizeof_unsigned_long, @@ -138,6 +139,11 @@ def restore(xd, fd): if m: store_mfn = int(m.group(2)) dominfo.setStoreRef(store_mfn) + log.debug("IntroduceDomain %d %d %d %s", + dominfo.getDomid(), + store_mfn, + dominfo.store_channel.port1, + dominfo.getDomainPath()) IntroduceDomain(dominfo.getDomid(), store_mfn, dominfo.store_channel.port1, @@ -161,34 +167,40 @@ def forkHelper(cmd, fd, inputHandler, closeToChild): if closeToChild: child.tochild.close() - fds = [child.fromchild.fileno(), - child.childerr.fileno()] - p = select.poll() - map(p.register, fds) - while len(fds) > 0: - r = p.poll() - for (fd, event) in r: - if event & select.POLLHUP or event & select.POLLERR: - fds.remove(fd) - p.unregister(fd) - continue - if not event & select.POLLIN: - continue - if fd == child.childerr.fileno(): - lasterr = child.childerr.readline().rstrip() - log.error('%s', lasterr) - else: - l = child.fromchild.readline().rstrip() - while l: - log.debug('%s', l) - inputHandler(l, child.tochild) - try: + try: + fds = [child.fromchild.fileno(), + child.childerr.fileno()] + p = select.poll() + map(p.register, fds) + while len(fds) > 0: + r = p.poll() + for (fd, event) in r: + if event & select.POLLIN: + if fd == child.childerr.fileno(): + lasterr = child.childerr.readline().rstrip() + log.error('%s', lasterr) + else: l = child.fromchild.readline().rstrip() - except: - l = None - - child.fromchild.close() - child.childerr.close() + while l: + log.debug('%s', l) + inputHandler(l, child.tochild) + try: + l = child.fromchild.readline().rstrip() + except: + l = None + + if event & select.POLLERR: + raise XendError('Error reading from child process for %s', + cmd) + + if event & select.POLLHUP: + fds.remove(fd) + p.unregister(fd) + finally: + child.fromchild.close() + child.childerr.close() + if not closeToChild: + child.tochild.close() if child.wait() >> 8 == 127: lasterr = "popen failed" |