Subject: mailing-list for TeXmacs Users
List archive
From : Nicola Mingotti <address@hidden>- To: Massimiliano Gubinelli <address@hidden>
- Cc: texmacs-users <address@hidden>
- Subject: Re: [TeXmacs] Is SIGINT sent to plugins ?
- Date: Wed, 12 Dec 2018 10:01:07 -0800
Hi Max,
On 12/12/18 8:56 AM, Massimiliano Gubinelli wrote:
Hi again,
On 11. Dec 2018, at 20:11, Nicola Mingotti <address@hidden> wrote:
Hi again,
I am puzzled, I am trying to get the SIGINT from my plugin
but it seems to me TeXmacs is not sending that signal.
Seems there is a bug with the signals. I attach a patch and a test program
(which has to be installed as a plugin).
I will commit a patch in svn.
Best
Max
-----------------------------------------------------------------------
The patch
-8<---------------------------------------------------------------------
Index: src/Plugins/Qt/qt_pipe_link.cpp
===================================================================
--- src/Plugins/Qt/qt_pipe_link.cpp (revision 11316)
+++ src/Plugins/Qt/qt_pipe_link.cpp (working copy)
@@ -148,7 +148,11 @@
qt_error << "SIGINT not implemented on Windows\n";
#else
Q_PID pid = PipeLink.pid ();
- int ret = ::killpg (pid, SIGINT);
+
+ // REMARK: previously there were here below a call to ::killpg which does
not seems to work on MacOS
+ // I (mgubi) replaced it with ::kill which does the job. But I do not
undestand the difference.
+
+ int ret = ::kill (pid, SIGINT);
if (ret == -1) {
qt_error << "Interrupt not successful, pid: " << pid << " return code: " << errno
<< "\n";
}
-8<--------------------------------------------------------------------
The test program
-8<--------------------------------------------------------------------
#include <iostream>
#include <unistd.h>
#include <csignal>
using namespace std;
#define DATA_BEGIN ((char) 2)
#define DATA_END ((char) 5)
#define DATA_ESCAPE ((char) 27)
bool trig = true;
int cc = 0;
void signalHandler( int signum ) {
trig = false;
}
int
main () {
cout << DATA_BEGIN << "verbatim:";
cout << "STARTING\n";
cout << DATA_END;
cout.flush ();
// register signal SIGINT and signal handler
signal(SIGINT, signalHandler);
while (1) {
char buffer[100];
cin.getline (buffer, 100, '\n');
cout << DATA_BEGIN << "verbatim:";
cout << "Input: " << buffer << "\n";
cout.flush ();
while (trig) {
cout << "Going to sleep.... (" << cc ++ << ")\n";
cout.flush ();
sleep (1);
}
cout << DATA_END;
cout.flush ();
trig = true; cc = 0;
}
return 0;
}
-8<--------------------------------------------------------------------
I am using TeXmacs version 1.99.4 in FreeBSD.
Do you know of any plugin who is actually managing SIGINT correctly ?
I tried Python (not working, not implemented IFACSay), Scheme (no button),
Maxima (not working).
I test the SIGINT is not working in this way, for Python i can actually
check there is not signal receiver in the code, so, not a TeXmacs problem,
but the method I use in general is:
1] Run a sleep command, 10 seconds
2] Press the STOP button in TeXmacs
3] Run a simple arithmentic command e.g. 1+1
=== Pyjhon ===
import timePRESS QUIT
timp.sleep(10)
1+1HANGS till end of sleep
=============
==== Maxima ====
:lisp (sleep 10)PRESS QUIT
1HANGS till end of sleep
================
Maybe also Maxima plugin is not catching the SIGINT...
In my plugin managed to receive the signal but I don't see it coming when i
press the STOP button.
Do you know something about it ?
bye
Nicola
Thank you a lot Max !
This is really an important feature and it should be working.
I was trying to trace the call from STOP button pressure downwill, but i could not
solve it. In particular I was not able to unfold the thing down until arriving to the
file you point: qt_pipe_link.cpp . I attach you my notes. I know almost nothing of Qt programming
probably i got lost for it.
But, ok, I will try to insert your patch manually and recompile the Freebsd port.
I will let you know ASAP.
Sorry for the late replay.
bye
Nicola
<TeXmacs|1.99.4> <style|generic> <\body> ====== Notes on plugin STOP button ==================== Tracing the call top down: from the STOP button pressure downhill. \ -] <with|color|red|program-menu.scm> : STOP icon calls <marked|(plugin-interrupt)> -] <marked|plugin-interrupt> is defined in <with|color|red|plugin-eval.scm>\ \; (tm-define (<marked|plugin-interrupt>)<next-line><nbsp>(let* ((lan (get-env ``prog-language"))<next-line><nbsp><nbsp><nbsp><nbsp><nbsp><nbsp><nbsp><nbsp>(ses (get-env ``prog-session")))<next-line><nbsp><nbsp><nbsp>(if (== (connection-status lan ses) 3)<next-line><nbsp><nbsp><nbsp><nbsp><nbsp><nbsp><nbsp>(<marked|connection-interrupt> lan ses))<next-line><nbsp><nbsp><nbsp>(plugin-cancel lan ses #f)))<next-line> -]<space|1em><verbatim|(connection-interrupt \Pruby\Q \Pdefault\Q)> does not interrupt connection when Ruby has been sent to sleep. That is, Ruby keeps on sleeping. Let's see what it calls. -] In <with|color|red|build-glue-basic.scm> <marked|connection-interrupt> seems to call <marked|connection_interrupt><next-line> -] In file: <with|color|red|... System/Link/connection.cpp> , it seems the method \Pinterrupt\Q is called on \Pcon\Q (connection object)\ void<next-line><marked|connection_interrupt> (string name, string session) {<next-line><nbsp>// cout \<less\>\<less\> ``Interrupt '' \<less\>\<less\> name \<less\>\<less\> ``, '' \<less\>\<less\> session \<less\>\<less\> ``\\n";<next-line><nbsp>connection con= connection (name * ``-'' * session);<next-line><nbsp>if (is_nil (con)) return;<next-line><nbsp><marked|con-\<gtr\>interrupt ();><next-line><nbsp>con-\<gtr\>listen ();<next-line>}<next-line> void<next-line>connection_rep::interrupt () {<next-line><nbsp>if (ln-\<gtr\>alive) {<next-line><nbsp><marked|ln-\<gtr\>interrupt ();><next-line><nbsp><nbsp><nbsp>if (status == WAITING_FOR_OUTPUT)<next-line><nbsp><nbsp><nbsp><nbsp><nbsp>status= CONNECTION_DYING;<next-line><nbsp>}<next-line>}<next-line><next-line><marked|RESOURCE(connection);><next-line>struct connection_rep: rep\<less\>connection\<gtr\> {<next-line><nbsp>string <nbsp>name; <nbsp><nbsp><nbsp><nbsp><nbsp><nbsp><nbsp><nbsp><nbsp>// name of the pipe type<next-line><nbsp>string <nbsp>session; <nbsp><nbsp><nbsp><nbsp><nbsp><nbsp>// name of the session<next-line><nbsp><marked|tm_link ln; <nbsp><nbsp>><nbsp><nbsp><nbsp><nbsp><nbsp><nbsp><nbsp><nbsp><nbsp>// the underlying link<next-line><nbsp>int <nbsp><nbsp><nbsp><nbsp>status; <nbsp><nbsp><nbsp><nbsp><nbsp><nbsp><nbsp>// status of the connection<next-line><nbsp>int <nbsp><nbsp><nbsp><nbsp>prev_status; <nbsp><nbsp>// last notified status<next-line><nbsp>bool <nbsp><nbsp><nbsp>forced_eval; <nbsp><nbsp>// forced input evaluation without call backs<next-line><nbsp>texmacs_input tm_in; <nbsp><nbsp>// texmacs input handler for data from child<next-line><nbsp>texmacs_input tm_err; <nbsp>// texmacs input handler for errors from child<next-line><next-line>public:<next-line><nbsp>connection_rep (string name, string session, tm_link ln);<next-line><nbsp>string start (bool again);<next-line><nbsp>void <nbsp><nbsp>write (string s);<next-line><nbsp>void <nbsp><nbsp>read (int channel);<next-line><nbsp>void <nbsp><nbsp>stop ();<next-line><nbsp>void <nbsp><nbsp>interrupt ();<next-line><nbsp>void <nbsp><nbsp>listen ();<next-line>};<next-line>RESOURCE_CODE(connection);<next-line><next-line>-] The last file includes <with|color|red|connect.hpp> which includes <with|color|red|tm_link.hpp> -] In <with|color|red|tm_link.hpp> interrupt method is declared but it is not defined in in <with|color|red|tm_link.cpp> \; =======\<gtr\> I can't connect to qt_pipe_link.cpp\ -] In file <with|color|red|qt_pipe_link.cpp><next-line> void<next-line>qt_pipe_link_rep::interrupt () {<next-line><nbsp>if (!alive) return;<next-line>#if defined(__MINGW__) \|\| defined(__MINGW32__)<next-line><nbsp>// Not implemented<next-line>#else<next-line><nbsp><marked|::killpg(PipeLink.pid (), SIGINT);><next-line>#endif<next-line>}<next-line><next-line> </body> <\initial> <\collection> <associate|font-base-size|9> <associate|font-family|tt> </collection> </initial>
- [TeXmacs] Is SIGINT sent to plugins ?, Nicola Mingotti, 12/11/2018
- Re: [TeXmacs] Is SIGINT sent to plugins ?, Massimiliano Gubinelli, 12/12/2018
- Re: [TeXmacs] Is SIGINT sent to plugins ?, Massimiliano Gubinelli, 12/12/2018
- Re: [TeXmacs] Is SIGINT sent to plugins ?, Nicola Mingotti, 12/12/2018
- Re: [TeXmacs] Is SIGINT sent to plugins ?, Massimiliano Gubinelli, 12/12/2018
- Re: [TeXmacs] Is SIGINT sent to plugins ?, Nicola Mingotti, 12/13/2018
- Re: [TeXmacs] Is SIGINT sent to plugins ?, Massimiliano Gubinelli, 12/12/2018
- Re: [TeXmacs] Is SIGINT sent to plugins ?, Nicola Mingotti, 12/12/2018
Archive powered by MHonArc 2.6.19.