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