]> git.neil.brown.name Git - plato.git/commitdiff
cmd: improve detection of command-finished.
authorNeilBrown <neilb@suse.de>
Mon, 14 Jan 2013 20:23:30 +0000 (07:23 +1100)
committerNeilBrown <neilb@suse.de>
Mon, 14 Jan 2013 20:23:30 +0000 (07:23 +1100)
We sometimes get an error on read, and spin on it forever.

plato/cmd.py

index c841294dd083e562e22cda27266a9a6bbf272bc9..941fda6889f672e35888c656cd56932f52232ecc 100644 (file)
@@ -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)