ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/util/rcomb.c
(Generate patch)

Comparing ray/src/util/rcomb.c (file contents):
Revision 2.11 by greg, Tue May 21 16:27:26 2024 UTC vs.
Revision 2.15 by greg, Thu May 23 01:28:07 2024 UTC

# Line 5 | Line 5 | static const char RCSid[] = "$Id$";
5   * General component matrix combiner, operating on a row at a time.
6   */
7  
8 + #include <signal.h>
9   #include <math.h>
10   #include "platform.h"
11   #include "rtprocess.h"
# Line 56 | Line 57 | int            cur_chan;                       /* if we're looping channels */
57   SUBPROC         *cproc = NULL;                  /* child process array */
58   int             nchildren = 0;                  /* # of child processes */
59   int             inchild = -1;                   /* our child ID (-1: parent) */
60 + int             pgid = -1;                      /* process group ID */
61 + int             nr_out = 0;                     /* # of rows output by kids */
62  
63   static int      checksymbolic(ROPMAT *rop);
64  
65 + static void
66 + on_sigio(int dummy)
67 + {
68 +        nr_out++;                       /* happens when child outputs row */
69 + }
70 +
71   static int
72   split_input(ROPMAT *rop)
73   {
# Line 586 | Line 595 | spawned_children(int np)
595   #endif
596                  return(0);
597          }
598 +        pgid = setpgrp();       /* set process group ID */
599 +        signal(SIGIO, on_sigio);
600          fflush(stdout);         /* flush header & spawn children */
601          cproc = (SUBPROC *)malloc(sizeof(SUBPROC)*np);
602          if (!cproc)
# Line 656 | Line 667 | parent_loop()
667                  break;
668              for (i = 0; i < nmats; i++)
669                  if (!rmx_write_data(mop[i].imx.mtx, mop[i].imx.ncomp,
670 <                                mop[i].imx.ncols, DTdouble, ofp))
670 >                                        mop[i].imx.ncols, DTdouble, ofp))
671                          return(0);
672              if (fflush(ofp) == EOF)
673                  return(0);
# Line 689 | Line 700 | combine_input()
700          int             set_r, set_c;
701          RMATRIX         *tmp = NULL;
702          int             co_set;
703 +        sigset_t        iomask;
704          int             i;
705  
706          if (mcat && mcat_last &&
# Line 708 | Line 720 | combine_input()
720                  set_c = varlookup("c") != NULL && !vardefined("c");
721          } else                          /* save a little time */
722                  set_r = set_c = 0;
723 <                                        /* read/process row-by-row */
723 >
724 >        sigemptyset(&iomask);           /* read/process row-by-row */
725 >        sigaddset(&iomask, SIGIO);
726          for (cur_row = row0; (in_nrows <= 0) | (cur_row < in_nrows); cur_row += rstep) {
727              RMATRIX     *mres = NULL;
728 +            if (inchild >= 0) sigprocmask(SIG_BLOCK, &iomask, NULL);
729              for (i = 0; i < nmats; i++)
730                  if (!rmx_load_row(mop[i].imx.mtx, &mop[i].imx, mop[i].infp)) {
731                          if (cur_row > in_nrows) /* unknown #input rows? */
# Line 719 | Line 734 | combine_input()
734                                          mop[i].inspec, cur_row);
735                          return(0);
736                  }
737 +            if (inchild >= 0) sigprocmask(SIG_UNBLOCK, &iomask, NULL);
738              if (i < nmats)
739                  break;
740              for (i = 0; i < nmats; i++)
# Line 760 | Line 776 | combine_input()
776                          return(0);
777              }
778              rmx_free(mres); mres = NULL;
779 <            if (inchild >= 0) {
780 <                i = getc(stdin);        /* child waits for turn to output */
781 <                if (i != EOF) ungetc(i, stdin);
779 >            if (inchild >= 0) {         /* children share stdout */
780 >                while (nr_out < cur_row)
781 >                    pause();            /* wait for our turn */
782 >                sigprocmask(SIG_BLOCK, &iomask, NULL);
783              }
784              if (!rmx_write_data(res->rmp->mtx, res->rmp->ncomp,
785                                  res->rmp->ncols, res->rmp->dtype, stdout))
786                  return(0);
787 <            if (inchild >= 0 && fflush(stdout) == EOF)
788 <                return(0);
787 >            if (inchild >= 0) {         /* flush and notify group */
788 >                if (fflush(stdout) == EOF)
789 >                    return(0);
790 >                sigprocmask(SIG_UNBLOCK, &iomask, NULL);
791 >                killpg(pgid, SIGIO);    /* increments everyone's nr_out */
792 >            }
793          }
794          return(inchild >= 0 || fflush(stdout) != EOF);
795   memerror:
# Line 901 | Line 922 | main(int argc, char *argv[])
922                                  if (n && !isflt(argv[i+1])) {
923                                          mop[nmats].preop.csym = argv[++i];
924                                          mop[nmats].preop.clen = 0;
925 +                                        mcat_last = 0;
926                                          break;
927                                  }
928                                  if (n > MAXCOMP*MAXCOMP) n = MAXCOMP*MAXCOMP;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines