From: Mojca M. <moj...@gm...> - 2014-02-09 11:29:41
|
On Sun, Feb 9, 2014 at 12:11 PM, Mojca Miklavec wrote: > On Sun, Feb 9, 2014 at 1:19 AM, sfeam wrote: >> On Sunday, 09 February 2014 01:01:20 AM Mojca Miklavec wrote: >>> > Another possible test: >>> > Change the timeout value on line 259 from >>> > qt->socket.waitForConnected(200); >>> > to >>> > qt->socket.waitForConnected(-1); >>> > >>> > This could potentially cause gnuplot to hang, but it also might work >>> >>> Gnuplot runs at 99% CPU with or without that change (just gnuplot, >>> gnuplot_qt doesn't consume any CPU at all after the first few >>> seconds). >> >> gnuplot is spinning CPU cycles while waiting for a timeout? >> The OSX implementation must really suck. >> Anyhow if you can see the gnuplot_qt process but the waitForConnected >> fails to return that's probably a huge clue to what's gone wrong. >> Let me think about this for a while. >> >> I'm cc-ing Jérôme Lodewyck. Maybe he can decipher the clue. > > I don't know if that's a clue or not, but if I run gdb and manually > press "n", only a single gnuplot_qt is started and gnuplot actually > returns to the console (if I simply run gnuplot, it runs at 99% CPU > "forever"). The first "plot sin(x)" doesn't show anything, but when I > plot something for the second time, the plot is actually shown. > > So maybe there's just a problem of wrong > timing/synchronisation/initialisation somewhere after all. > > The fact is that if I actually get to this point (by manually stepping > inside gdb), it works a lot better than it did with forking: > - printing doesn't crash > - there is no need for the dirty hack removeDockIcon() > TransformProcessType(&psn, kProcessTransformToBackgroundApplication); > to hide the nofunctional window And indeed if I change the timeout: --- a/src/qtterminal/qt_term.cpp +++ b/src/qtterminal/qt_term.cpp @@ -251,7 +252,7 // The QLocalSocket::waitForConnected does not respect the time out argument when the // gnuplot_qt application is not yet started. To wait for it, we need to implement the timeout ourselves - QDateTime timeout = QDateTime::currentDateTime().addMSecs(1000); + QDateTime timeout = QDateTime::currentDateTime().addMSecs(10000); do { qt->socket.connectToServer(server); it suddenly almost starts working. I'm saying almost because the first plot doesn't work, but the second one does. Terminal type set to 'qt' gnuplot> plot sin(x) # nothing can be seen started detached process "qtgnuplot31706" gnuplot> plot cos(x) # works gnuplot> It seems that gnuplot gives up too quickly. And if it does give up, the second attempt to connect doesn't work properly, ends up with two instances of gnuplot_qt running (none of them gets closed etc). According to a gdb a lot of that "infinite cycling" (when not properly connected) happens with while (!receivedFontPropos) qt->socket.waitForReadyRead(1000); while (qt->socket.bytesAvailable() >= (int)sizeof(gp_event_t)) } The following is "sampling" of the running gnuplot at 99% CPU: Call graph: 2510 Thread_2393718 DispatchQueue_1: com.apple.main-thread (serial) + 2510 start (in gnuplot) + 52 [0x100011244] + 2510 main (in gnuplot) + 2796 [0x1000aa62c] plot.c:672 + 2510 com_line (in gnuplot) + 144 [0x100025140] command.c:323 + 2510 do_line (in gnuplot) + 1066 [0x10002559a] command.c:411 + 2510 command (in gnuplot) + 131 [0x100026283] command.c:616 + 2510 plot_command (in gnuplot) + 206 [0x100028d1e] command.c:1559 + 2510 plotrequest (in gnuplot) + 1763 [0x1000abf83] plot2d.c:273 + 2510 eval_plots (in gnuplot) + 27828 [0x1000c00c4] plot2d.c:3259 + 2510 do_plot (in gnuplot) + 131 [0x100062843] graphics.c:517 + 2510 term_start_plot (in gnuplot) + 63 [0x10011476f] term.c:557 + 2510 qt_graphics (in gnuplot) + 669 [0x1001da68d] qt_term.cpp:480 + 1582 qt_sendFont() (in gnuplot) + 772 [0x1001da264] qt_term.cpp:424 + ! 962 QLocalSocket::bytesAvailable() const (in QtNetwork) + 42 [0x1022520fa] + ! : 646 QAbstractSocket::bytesAvailable() const (in QtNetwork) + 16 [0x102245210] + ! : | 646 QIODevice::bytesAvailable() const (in QtCore) + 0,20,... [0x1030389a0,0x1030389b4,...] + ! : 248 QAbstractSocket::bytesAvailable() const (in QtNetwork) + 0,16,... [0x102245200,0x102245210,...] + ! : 68 DYLD-STUB$$QIODevice::bytesAvailable() const (in QtNetwork) + 0 [0x10226ca8a] + ! 295 QLocalSocket::bytesAvailable() const (in QtNetwork) + 16 [0x1022520e0] + ! : 295 QIODevice::bytesAvailable() const (in QtCore) + 0,85,... [0x1030389a0,0x1030389f5,...] + ! 236 QLocalSocket::bytesAvailable() const (in QtNetwork) + 6,16,... [0x1022520d6,0x1022520e0,...] + ! 89 DYLD-STUB$$QIODevice::bytesAvailable() const (in QtNetwork) + 0 [0x10226ca8a] + 342 qt_sendFont() (in gnuplot) + 737 [0x1001da241] qt_term.cpp:423 + ! 195 QLocalSocket::waitForReadyRead(int) (in QtNetwork) + 6,51,... [0x1022526c6,0x1022526f3,...] + ! 147 QLocalSocket::waitForReadyRead(int) (in QtNetwork) + 18 [0x1022526d2] + ! 147 QLocalSocket::state() const (in QtNetwork) + 0,8 [0x10224aed0,0x10224aed8] + 180 qt_sendFont() (in gnuplot) + 748,772,... [0x1001da24c,0x1001da264,...] qt_term.cpp:424 + 118 qt_sendFont() (in gnuplot) + 737,713,... [0x1001da241,0x1001da229,...] qt_term.cpp:423 + 110 DYLD-STUB$$QLocalSocket::waitForReadyRead(int) (in gnuplot) + 0 [0x1001e38b6] + 97 DYLD-STUB$$QLocalSocket::bytesAvailable() const (in gnuplot) + 0 [0x1001e38ec] + 47 qt_sendFont() (in gnuplot) + 695 [0x1001da217] qt_term.cpp:421 + 34 qt_sendFont() (in gnuplot) + 999 [0x1001da347] qt_term.cpp:437 2510 Thread_2393731 DispatchQueue_2: com.apple.libdispatch-manager (serial) + 2510 _dispatch_mgr_thread (in libdispatch.dylib) + 54 [0x7fff8c328316] + 2510 _dispatch_mgr_invoke (in libdispatch.dylib) + 923 [0x7fff8c329786] + 2510 kevent (in libsystem_kernel.dylib) + 10 [0x7fff8b5e27e6] 2510 Thread_2393735: QProcessManager 2510 thread_start (in libsystem_c.dylib) + 13 [0x7fff89671b75] 2510 _pthread_start (in libsystem_c.dylib) + 335 [0x7fff8966e8bf] 2510 QThreadPrivate::start(void*) (in QtCore) + 504 [0x102fad238] 2510 QProcessManager::run() (in QtCore) + 168 [0x10307d7b8] 2510 __select (in libsystem_kernel.dylib) + 10 [0x7fff8b5e1df2] Total number in stack (recursive counted multiple, when >=5): Sort by top of stack, same collapsed (when >= 5): __select (in libsystem_kernel.dylib) 2510 kevent (in libsystem_kernel.dylib) 2510 QIODevice::bytesAvailable() const (in QtCore) 941 qt_sendFont() (in gnuplot) 379 QAbstractSocket::bytesAvailable() const (in QtNetwork) 248 QLocalSocket::bytesAvailable() const (in QtNetwork) 236 QLocalSocket::waitForReadyRead(int) (in QtNetwork) 195 DYLD-STUB$$QIODevice::bytesAvailable() const (in QtNetwork) 157 QLocalSocket::state() const (in QtNetwork) 147 DYLD-STUB$$QLocalSocket::waitForReadyRead(int) (in gnuplot) 110 DYLD-STUB$$QLocalSocket::bytesAvailable() const (in gnuplot) 97 Mojca |