Revision: 77996
http://sourceforge.net/p/brlcad/code/77996
Author: starseeker
Date: 2020-12-18 03:58:16 +0000 (Fri, 18 Dec 2020)
Log Message:
-----------
Setting a _ged_rt_output_handler on BU_PROCESS_STDOUT was breaking the Mac.
Try a different approach.
Modified Paths:
--------------
brlcad/trunk/include/ged/defines.h
brlcad/trunk/src/libged/ged_util.c
brlcad/trunk/src/libged/rtcheck/rtcheck.c
brlcad/trunk/src/libged/rtwizard/rtwizard.c
brlcad/trunk/src/libtclcad/command_io.cpp
Modified: brlcad/trunk/include/ged/defines.h
===================================================================
--- brlcad/trunk/include/ged/defines.h 2020-12-17 21:41:11 UTC (rev 77995)
+++ brlcad/trunk/include/ged/defines.h 2020-12-18 03:58:16 UTC (rev 77996)
@@ -129,6 +129,9 @@
void *chan;
int aborted;
struct ged *gedp;
+ int stdin_active;
+ int stdout_active;
+ int stderr_active;
};
/* FIXME: should be private */
Modified: brlcad/trunk/src/libged/ged_util.c
===================================================================
--- brlcad/trunk/src/libged/ged_util.c 2020-12-17 21:41:11 UTC (rev 77995)
+++ brlcad/trunk/src/libged/ged_util.c 2020-12-18 03:58:16 UTC (rev 77996)
@@ -1339,7 +1339,8 @@
struct ged_subprocess *rrtp = (struct ged_subprocess *)clientData;
int count = 0;
int retcode = 0;
- int read_failed = 0;
+ int read_failed_stderr = 0;
+ int read_failed_stdout = 0;
char line[RT_MAXLINE+1] = {0};
if ((rrtp == (struct ged_subprocess *)NULL) || (rrtp->gedp == (struct ged
*)NULL))
@@ -1350,19 +1351,22 @@
struct ged *gedp = rrtp->gedp;
/* Get data from rt */
- if (bu_process_read((char *)line, &count, rrtp->p, BU_PROCESS_STDERR,
RT_MAXLINE) <= 0) {
- if (bu_process_read((char *)line, &count, rrtp->p, BU_PROCESS_STDOUT,
RT_MAXLINE) <= 0) {
- read_failed = 1;
- }
+ if (rrtp->stderr_active && bu_process_read((char *)line, &count, rrtp->p,
BU_PROCESS_STDERR, RT_MAXLINE) <= 0) {
+ read_failed_stderr = 1;
}
+ if (rrtp->stdout_active && bu_process_read((char *)line, &count, rrtp->p,
BU_PROCESS_STDOUT, RT_MAXLINE) <= 0) {
+ read_failed_stdout = 1;
+ }
- if (read_failed) {
+ if (read_failed_stderr || read_failed_stdout) {
int aborted;
/* Done watching for output, undo subprocess I/O hooks. */
if (gedp->ged_delete_io_handler) {
- (*gedp->ged_delete_io_handler)(rrtp, BU_PROCESS_STDERR);
- (*gedp->ged_delete_io_handler)(rrtp, BU_PROCESS_STDOUT);
+ if (rrtp->stderr_active)
+ (*gedp->ged_delete_io_handler)(rrtp, BU_PROCESS_STDERR);
+ if (rrtp->stdout_active)
+ (*gedp->ged_delete_io_handler)(rrtp, BU_PROCESS_STDOUT);
}
@@ -1485,6 +1489,9 @@
BU_GET(run_rtp, struct ged_subprocess);
run_rtp->magic = GED_CMD_MAGIC;
+ run_rtp->stdin_active = 0;
+ run_rtp->stdout_active = 0;
+ run_rtp->stderr_active = 0;
bu_ptbl_ins(&gedp->ged_subp, (long *)run_rtp);
run_rtp->p = p;
@@ -1494,7 +1501,6 @@
/* If we know how, set up hooks so the parent process knows to watch for
output. */
if (gedp->ged_create_io_handler) {
(*gedp->ged_create_io_handler)(run_rtp, BU_PROCESS_STDERR,
_ged_rt_output_handler, (void *)run_rtp);
- (*gedp->ged_create_io_handler)(run_rtp, BU_PROCESS_STDOUT,
_ged_rt_output_handler, (void *)run_rtp);
}
return GED_OK;
}
Modified: brlcad/trunk/src/libged/rtcheck/rtcheck.c
===================================================================
--- brlcad/trunk/src/libged/rtcheck/rtcheck.c 2020-12-17 21:41:11 UTC (rev
77995)
+++ brlcad/trunk/src/libged/rtcheck/rtcheck.c 2020-12-18 03:58:16 UTC (rev
77996)
@@ -272,6 +272,10 @@
rtcp->rrtp->p = p;
rtcp->rrtp->aborted = 0;
rtcp->rrtp->gedp = gedp;
+ rtcp->rrtp->stdin_active = 0;
+ rtcp->rrtp->stdout_active = 0;
+ rtcp->rrtp->stderr_active = 0;
+
if (gedp->ged_create_io_handler) {
(*gedp->ged_create_io_handler)(rtcp->rrtp, BU_PROCESS_STDOUT,
rtcheck_vector_handler, (void *)rtcp);
}
Modified: brlcad/trunk/src/libged/rtwizard/rtwizard.c
===================================================================
--- brlcad/trunk/src/libged/rtwizard/rtwizard.c 2020-12-17 21:41:11 UTC (rev
77995)
+++ brlcad/trunk/src/libged/rtwizard/rtwizard.c 2020-12-18 03:58:16 UTC (rev
77996)
@@ -57,6 +57,9 @@
BU_GET(run_rtp, struct ged_subprocess);
run_rtp->magic = GED_CMD_MAGIC;
+ run_rtp->stdin_active = 0;
+ run_rtp->stdout_active = 0;
+ run_rtp->stderr_active = 0;
bu_ptbl_ins(&gedp->ged_subp, (long *)run_rtp);
run_rtp->p = p;
Modified: brlcad/trunk/src/libtclcad/command_io.cpp
===================================================================
--- brlcad/trunk/src/libtclcad/command_io.cpp 2020-12-17 21:41:11 UTC (rev
77995)
+++ brlcad/trunk/src/libtclcad/command_io.cpp 2020-12-18 03:58:16 UTC (rev
77996)
@@ -79,6 +79,17 @@
if (fdp) {
struct tclcad_io_data *t_iod = (struct tclcad_io_data
*)p->gedp->ged_io_data;
Tcl_CreateFileHandler(*fdp, t_iod->io_mode, callback, (ClientData)data);
+ switch (d) {
+ case BU_PROCESS_STDIN:
+ p->stdin_active = 1;
+ break;
+ case BU_PROCESS_STDOUT:
+ p->stdout_active = 1;
+ break;
+ case BU_PROCESS_STDERR:
+ p->stderr_active = 1;
+ break;
+ }
}
}
@@ -92,6 +103,17 @@
Tcl_DeleteFileHandler(*fdp);
close(*fdp);
}
+ switch (d) {
+ case BU_PROCESS_STDIN:
+ p->stdin_active = 0;
+ break;
+ case BU_PROCESS_STDOUT:
+ p->stdout_active = 0;
+ break;
+ case BU_PROCESS_STDERR:
+ p->stderr_active = 0;
+ break;
+ }
}
@@ -118,6 +140,7 @@
if (fdp) {
switch (d) {
case BU_PROCESS_STDIN:
+ p->stdin_active = 1;
if (!pchan->cstdin) {
pchan->cstdin = Tcl_MakeFileChannel(*fdp, t_iod->io_mode);
Tcl_CreateChannelHandler(pchan->cstdin, t_iod->io_mode,
callback, (ClientData)data);
@@ -124,6 +147,7 @@
}
break;
case BU_PROCESS_STDOUT:
+ p->stdout_active = 1;
if (!pchan->cstdout) {
pchan->cstdout = Tcl_MakeFileChannel(*fdp, t_iod->io_mode);
Tcl_CreateChannelHandler(pchan->cstdout, t_iod->io_mode,
callback, (ClientData)data);
@@ -130,6 +154,7 @@
}
break;
case BU_PROCESS_STDERR:
+ p->stderr_active = 1;
if (!pchan->cstderr) {
pchan->cstderr = Tcl_MakeFileChannel(*fdp, t_iod->io_mode);
Tcl_CreateChannelHandler(pchan->cstderr, t_iod->io_mode,
callback, (ClientData)data);
@@ -160,25 +185,28 @@
switch (d) {
case BU_PROCESS_STDIN:
- if (pchan->cstdin) {
+ if (p->stdin_active && pchan->cstdin) {
Tcl_DeleteChannelHandler(pchan->cstdin, NULL, (ClientData)NULL);
Tcl_Close(t_iod->interp, pchan->cstdin);
pchan->cstdin = NULL;
}
+ p->stdin_active = 0;
break;
case BU_PROCESS_STDOUT:
- if (pchan->cstdout) {
+ if (p->stdout_active && pchan->cstdout) {
Tcl_DeleteChannelHandler(pchan->cstdout, NULL,
(ClientData)NULL);
Tcl_Close(t_iod->interp, pchan->cstdout);
pchan->cstdout = NULL;
}
+ p->stdout_active = 0;
break;
case BU_PROCESS_STDERR:
- if (pchan->cstderr) {
+ if (p->stdout_err && pchan->cstderr) {
Tcl_DeleteChannelHandler(pchan->cstderr, NULL,
(ClientData)NULL);
Tcl_Close(t_iod->interp, pchan->cstderr);
pchan->cstderr = NULL;
}
+ p->stdout_err = 0;
break;
}
}
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