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

Reply via email to