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

Comparing ray/src/rt/persist.c (file contents):
Revision 2.8 by greg, Wed Mar 3 09:07:52 1993 UTC vs.
Revision 2.13 by greg, Thu Jul 4 09:54:59 1996 UTC

# Line 1 | Line 1
1 < /* Copyright (c) 1993 Regents of the University of California */
1 > /* Copyright (c) 1996 Regents of the University of California */
2  
3   #ifndef lint
4   static char SCCSid[] = "$SunId$ LBL";
# Line 25 | Line 25 | extern char    *strcpy(), *index();
25  
26   extern int      headismine;     /* boolean true if header belongs to me */
27  
28 + extern char     *progname;      /* global program name */
29 +
30   static char     *persistfname = NULL;   /* persist file name */
31   static int      persistfd = -1;         /* persist file descriptor */
32  
# Line 73 | Line 75 | int    lf;
75   persistfile(pfn)        /* open persist file and lock it */
76   char    *pfn;
77   {
78 <        persistfd = open(pfn, O_WRONLY|O_CREAT|O_EXCL, 0666);
78 >        persistfd = open(pfn, O_WRONLY|O_CREAT|O_EXCL, 0644);
79          if (persistfd >= 0) {
80                  persistfname = pfn;
81                  pflock(1);
# Line 90 | Line 92 | char   *pfn;
92   }
93  
94  
95 < int sig_noop() {}
95 > static int      got_io;
96  
97 + static int sig_io() { got_io++; }
98  
99 + static int sig_alrm() { quit(0); }
100 +
101 +
102   pfhold()                /* holding pattern for idle rendering process */
103   {
104 <        char    buf[128];
104 >        int     (*oldalrm)();
105 >        char    buf[512];
106          register int    n;
107                                  /* close input and output descriptors */
108          close(fileno(stdin));
109          close(fileno(stdout));
110                                  /* create named pipes for input and output */
111 <        if (mknod(mktemp(strcpy(inpname,TEMPLATE)), S_IFIFO|0600) < 0)
111 >        if (mknod(mktemp(strcpy(inpname,TEMPLATE)), S_IFIFO|0600, 0) < 0)
112                  goto createrr;
113 <        if (mknod(mktemp(strcpy(outpname,TEMPLATE)), S_IFIFO|0600) < 0)
113 >        if (mknod(mktemp(strcpy(outpname,TEMPLATE)), S_IFIFO|0600, 0) < 0)
114                  goto createrr;
115 <        sprintf(buf, "%d\n%s\n%s\n", getpid(), inpname, outpname);
116 <        if (lseek(persistfd, 0L, 0) < 0)
117 <                error(SYSTEM, "seek error on persist file in pfhold");
115 >        sprintf(buf, "%s %d\n%s\n%s\n", progname, getpid(), inpname, outpname);
116 >        if (lseek(persistfd, 0L, 0) < 0 || ftruncate(persistfd, 0L) < 0)
117 >                error(SYSTEM, "seek/truncate error on persist file");
118          n = strlen(buf);
119          if (write(persistfd, buf, n) < n)
120 <                error(SYSTEM, "error writing persist file in pfhold");
120 >                error(SYSTEM, "error writing persist file");
121                                  /* wait TIMELIM for someone to signal us */
122 <        signal(SIGIO, sig_noop);
122 >        got_io = 0;
123 >        signal(SIGIO, sig_io);
124 >        oldalrm = (int (*)())signal(SIGALRM, sig_alrm);
125          alarm(TIMELIM);
126          pflock(0);
127 <        pause();
127 >        while (!got_io)
128 >                pause();
129          alarm(0);
130 +        signal(SIGALRM, oldalrm);
131          signal(SIGIO, SIG_DFL);
132          pflock(1);
133                                  /* someone wants us; reopen stdin and stdout */
# Line 140 | Line 151 | io_process()           /* just act as conduits to and from actu
151   {
152          register char   *cp;
153          register int    nr, n;
154 <        char    buf[4096], *pfin, *pfout;
154 >        char    buf[512], *pfin, *pfout;
155          int     pid;
156                                  /* load and close persist file */
157 <        nr = read(persistfd, buf, sizeof(buf));
157 >        sleep(5);               /* helps synchronization */
158 >        nr = read(persistfd, buf, sizeof(buf)-1);
159          pfdetach();
160 <        if (nr < 0)
160 >        if (nr <= 0)
161                  error(SYSTEM, "cannot read persist file");
162          buf[nr] = '\0';
163 <        if ((cp = index(buf, '\n')) == NULL)
163 >        if ((cp = index(buf, ' ')) == NULL)
164                  goto formerr;
165          *cp++ = '\0';
166 <        if ((pid = atoi(buf)) <= 0)
166 >        if ((pid = atoi(cp)) <= 0)
167                  goto formerr;
156        pfin = cp;
168          if ((cp = index(cp, '\n')) == NULL)
169                  goto formerr;
170 +        pfin = ++cp;
171 +        if ((cp = index(cp, '\n')) == NULL)
172 +                goto formerr;
173          *cp++ = '\0';
174          pfout = cp;
175          if ((cp = index(cp, '\n')) == NULL)
# Line 163 | Line 177 | io_process()           /* just act as conduits to and from actu
177          *cp++ = '\0';
178          if (cp-buf != nr)
179                  goto formerr;
180 +        if (strcmp(buf, progname)) {
181 +                sprintf(errmsg, "persist file for %s, not %s", buf, progname);
182 +                error(USER, errmsg);
183 +        }
184                                  /* wake up rendering process */
185          if (kill(pid, SIGIO) < 0)
186                  error(SYSTEM, "cannot signal rendering process in io_process");
# Line 180 | Line 198 | io_process()           /* just act as conduits to and from actu
198                          error(SYSTEM, "cannot open output pipe in io_process");
199          }
200                                  /* pass input to output */
201 <        cp = buf; n = sizeof(buf);
202 <                                /* do as much as we can each way */
203 <        while ((nr = read(0, cp, n)) > 0) {
204 <                nr += cp-buf;
205 <                if ((n = write(1, buf, nr)) <= 0)
206 <                        goto writerr;
207 <                cp = buf;
190 <                while (n < nr)
191 <                        *cp++ = buf[n++];
192 <                n = sizeof(buf) - (cp-buf);
193 <        }
201 >                                /* read as much as we can, write all of it */
202 >        while ((nr = read(0, cp=buf, sizeof(buf))) > 0)
203 >                do {
204 >                        if ((n = write(1, cp, nr)) <= 0)
205 >                                goto writerr;
206 >                        cp += n;
207 >                } while ((nr -= n) > 0);
208          if (nr < 0)
209                  error(SYSTEM, "read error in io_process");
210          close(0);               /* close input */
197        nr = cp-buf;            /* write remainder */
198        cp = buf;
199        while (nr > 0) {
200                if ((n = write(1, cp, nr)) <= 0)
201                        goto writerr;
202                cp += n;
203                nr -= n;
204        }
211          close(1);               /* close output */
212          if (pid)                /* parent waits for child */
213                  wait(0);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines