From: NeilBrown Date: Mon, 14 Jan 2013 20:23:30 +0000 (+1100) Subject: cmd: improve detection of command-finished. X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=09ca7a3e3d3b35639430a112263833f5e8005d25;p=plato.git cmd: improve detection of command-finished. We sometimes get an error on read, and spin on it forever. --- diff --git a/plato/cmd.py b/plato/cmd.py index c841294..941fda6 100644 --- a/plato/cmd.py +++ b/plato/cmd.py @@ -97,8 +97,8 @@ class ShellTask: set_noblock(self.job.stdout) set_noblock(self.job.stderr) self.wc = gobject.child_watch_add(self.job.pid, self.done) - self.wout = gobject.io_add_watch(self.job.stdout, gobject.IO_IN, self.read) - self.werr = gobject.io_add_watch(self.job.stderr, gobject.IO_IN, self.read) + self.wout = gobject.io_add_watch(self.job.stdout, gobject.IO_IN | gobject.IO_ERR | gobject.IO_HUP, self.read) + self.werr = gobject.io_add_watch(self.job.stderr, gobject.IO_IN | gobject.IO_ERR | gobject.IO_HUP, self.read) self.displayed = True @@ -107,6 +107,18 @@ class ShellTask: self.buff.insert(self.buff.get_end_iter(), l) gobject.idle_add(self.adjust) if l == "": + if self.job: + gobject.source_remove(self.wout) + gobject.source_remove(self.werr) + try: + self.job.terminate() + except: + pass + self.job.wait() + self.job.stdout.close() + self.job.stderr.close() + self.job = None + self.owner.update(self, None) return False return True @@ -115,12 +127,14 @@ class ShellTask: adj.set_value(adj.upper - adj.page_size) def done(self, *a): - self.read(self.job.stdout, None) - self.read(self.job.stderr, None) - gobject.source_remove(self.wout) - gobject.source_remove(self.werr) - self.job.stdout.close() - self.job.stderr.close() + if self.job: + self.read(self.job.stdout, None) + self.read(self.job.stderr, None) + if self.job: + gobject.source_remove(self.wout) + gobject.source_remove(self.werr) + self.job.stdout.close() + self.job.stderr.close() self.job = None self.owner.update(self, None)