Revision: 77074
          http://sourceforge.net/p/brlcad/code/77074
Author:   starseeker
Date:     2020-09-08 15:29:25 +0000 (Tue, 08 Sep 2020)
Log Message:
-----------
Need separate channels for in/out/err (MGED on Windows was crashing trying to 
close due to callbacks for both stdout and stderr channel closing.)

Modified Paths:
--------------
    brlcad/trunk/include/tclcad.h
    brlcad/trunk/src/libtclcad/commands.c

Modified: brlcad/trunk/include/tclcad.h
===================================================================
--- brlcad/trunk/include/tclcad.h       2020-09-06 14:33:29 UTC (rev 77073)
+++ brlcad/trunk/include/tclcad.h       2020-09-08 15:29:25 UTC (rev 77074)
@@ -518,7 +518,9 @@
  * Tcl specific I/O handlers
  */
 struct tclcad_io_data {
-    Tcl_Channel chan;
+       Tcl_Channel chan_stdin;
+    Tcl_Channel chan_stdout;
+    Tcl_Channel chan_stderr;
     Tcl_Interp *interp;
     int io_mode;
 };

Modified: brlcad/trunk/src/libtclcad/commands.c
===================================================================
--- brlcad/trunk/src/libtclcad/commands.c       2020-09-06 14:33:29 UTC (rev 
77073)
+++ brlcad/trunk/src/libtclcad/commands.c       2020-09-08 15:29:25 UTC (rev 
77074)
@@ -1215,8 +1215,20 @@
     struct tclcad_io_data *t_iod = (struct tclcad_io_data 
*)p->gedp->ged_io_data;
     HANDLE *fdp = (HANDLE *)bu_process_fd(p->p, d);
     if (fdp) {
-       t_iod->chan = Tcl_MakeFileChannel(*fdp, t_iod->io_mode);
-       Tcl_CreateChannelHandler(t_iod->chan, t_iod->io_mode, callback, 
(ClientData)data);
+               switch (d) {
+               case BU_PROCESS_STDIN:
+                       t_iod->chan_stdin = Tcl_MakeFileChannel(*fdp, 
t_iod->io_mode);
+                       Tcl_CreateChannelHandler(t_iod->chan_stdin, 
t_iod->io_mode, callback, (ClientData)data);
+                       break;
+               case BU_PROCESS_STDOUT:
+                       t_iod->chan_stdout = Tcl_MakeFileChannel(*fdp, 
t_iod->io_mode);
+                       Tcl_CreateChannelHandler(t_iod->chan_stdout, 
t_iod->io_mode, callback, (ClientData)data);
+                       break;
+               case BU_PROCESS_STDERR:
+                       t_iod->chan_stderr = Tcl_MakeFileChannel(*fdp, 
t_iod->io_mode);
+                       Tcl_CreateChannelHandler(t_iod->chan_stderr, 
t_iod->io_mode, callback, (ClientData)data);
+                       break;
+               }
     }
 }
 
@@ -1227,8 +1239,20 @@
     if (!p || !p->p || !p->gedp || !p->gedp->ged_io_data)
                return;
     struct tclcad_io_data *t_iod = (struct tclcad_io_data 
*)p->gedp->ged_io_data;
-    Tcl_DeleteChannelHandler(t_iod->chan, NULL, (ClientData)NULL);
-    Tcl_Close(t_iod->interp, t_iod->chan);
+       switch (d) {
+       case BU_PROCESS_STDIN:
+               Tcl_DeleteChannelHandler(t_iod->chan_stdin, NULL, 
(ClientData)NULL);
+               Tcl_Close(t_iod->interp, t_iod->chan_stdin);
+               break;
+       case BU_PROCESS_STDOUT:
+               Tcl_DeleteChannelHandler(t_iod->chan_stdout, NULL, 
(ClientData)NULL);
+               Tcl_Close(t_iod->interp, t_iod->chan_stdout);
+               break;
+       case BU_PROCESS_STDERR:
+               Tcl_DeleteChannelHandler(t_iod->chan_stderr, NULL, 
(ClientData)NULL);
+               Tcl_Close(t_iod->interp, t_iod->chan_stderr);
+               break;
+       }
 }
 #endif
 

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to