@@ -1663,6 +1663,51 @@ def _printGnuplotPipe(self, string):
1663
1663
format (len (string ), string ))
1664
1664
1665
1665
1666
+ def _receive_until_checkpoint_or_timeout (self , checkpoint , waitforever ):
1667
+
1668
+ fromerr = ''
1669
+ while not fromerr .endswith (checkpoint ):
1670
+ # if no data received in 5 seconds, the gnuplot process is stuck. This
1671
+ # usually happens if the gnuplot process is not in a command mode, but in
1672
+ # a data-receiving mode. I'm careful to avoid this situation, but bugs in
1673
+ # this module and/or in gnuplot itself can make this happen
1674
+
1675
+ self ._logEvent ("Trying to read byte from gnuplot" )
1676
+
1677
+ rlist ,wlist ,xlist = select .select ([self .gnuplotProcess .stderr ],[], [],
1678
+ None if waitforever else 15 )
1679
+
1680
+ if not rlist :
1681
+ self ._logEvent ("Gnuplot read timed out" )
1682
+ self .checkpoint_stuck = True
1683
+
1684
+ raise GnuplotlibError (
1685
+ r'''Gnuplot process no longer responding. This shouldn't happen... Is your X connection working?''' )
1686
+
1687
+ # read a byte. I'd like to read "as many bytes as are
1688
+ # available", but I don't know how to this in a very portable
1689
+ # way (I just know there will be windows users complaining if I
1690
+ # simply do a non-blocking read). Very little data will be
1691
+ # coming in anyway, so doing this a byte at a time is an
1692
+ # irrelevant inefficiency
1693
+ byte = self .gnuplotProcess .stderr .read (1 )
1694
+ if len (byte ) == 0 :
1695
+ # Did the child process die?
1696
+ returncode = self .gnuplotProcess .poll ()
1697
+ if returncode is not None :
1698
+ # Yep. It died.
1699
+ raise Exception (f"gnuplot child died. returncode = { returncode } " )
1700
+ self ._logEvent ("read() returned no data" )
1701
+ continue
1702
+
1703
+ byte = byte .decode ()
1704
+ fromerr += byte
1705
+ self ._logEvent ("Read byte '{}' ({}) from gnuplot child process" .format (byte ,
1706
+ hex (ord (byte ))))
1707
+
1708
+ self ._logEvent (f"Read string from gnuplot: '{ fromerr } '" )
1709
+ return fromerr
1710
+
1666
1711
# syncronizes the child and parent processes. After _checkpoint() returns, I
1667
1712
# know that I've read all the data from the child. Extra data that represents
1668
1713
# errors is returned. Warnings are explicitly stripped out
@@ -1698,47 +1743,7 @@ def _checkpoint(self, flags=''):
1698
1743
if not self .gnuplotProcess or not self .gnuplotProcess .stderr :
1699
1744
return '' ,[]
1700
1745
1701
- fromerr = ''
1702
- while not fromerr .endswith (checkpoint ):
1703
- # if no data received in 5 seconds, the gnuplot process is stuck. This
1704
- # usually happens if the gnuplot process is not in a command mode, but in
1705
- # a data-receiving mode. I'm careful to avoid this situation, but bugs in
1706
- # this module and/or in gnuplot itself can make this happen
1707
-
1708
- self ._logEvent ("Trying to read byte from gnuplot" )
1709
-
1710
- rlist ,wlist ,xlist = select .select ([self .gnuplotProcess .stderr ],[], [],
1711
- None if waitforever else 15 )
1712
-
1713
- if rlist :
1714
- # read a byte. I'd like to read "as many bytes as are
1715
- # available", but I don't know how to this in a very portable
1716
- # way (I just know there will be windows users complaining if I
1717
- # simply do a non-blocking read). Very little data will be
1718
- # coming in anyway, so doing this a byte at a time is an
1719
- # irrelevant inefficiency
1720
- byte = self .gnuplotProcess .stderr .read (1 )
1721
- if len (byte ) == 0 :
1722
- # Did the child process die?
1723
- returncode = self .gnuplotProcess .poll ()
1724
- if returncode is not None :
1725
- # Yep. It died.
1726
- raise Exception (f"gnuplot child died. returncode = { returncode } " )
1727
- byte = byte .decode ()
1728
- fromerr += byte
1729
- if byte is not None and len (byte ):
1730
- self ._logEvent ("Read byte '{}' ({}) from gnuplot child process" .format (byte ,
1731
- hex (ord (byte ))))
1732
- else :
1733
- self ._logEvent ("read() returned no data" )
1734
- else :
1735
- self ._logEvent ("Gnuplot read timed out" )
1736
- self .checkpoint_stuck = True
1737
-
1738
- raise GnuplotlibError (
1739
- r'''Gnuplot process no longer responding. This shouldn't happen... Is your X connection working?''' )
1740
-
1741
- self ._logEvent (f"Read string from gnuplot: '{ fromerr } '" )
1746
+ fromerr = self ._receive_until_checkpoint_or_timeout (checkpoint , waitforever )
1742
1747
1743
1748
m = re .search (rf'\s*(.*?)\s*{ checkpoint } $' , fromerr , re .M + re .S )
1744
1749
if m is None :
0 commit comments