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

Comparing ray/src/rt/ambient.c (file contents):
Revision 2.16 by greg, Fri Jan 22 09:51:13 1993 UTC vs.
Revision 2.19 by greg, Wed Aug 4 14:22:11 1993 UTC

# Line 35 | Line 35 | double minarad;                /* minimum ambient radius */
35  
36   static AMBTREE  atrunk;         /* our ambient trunk node */
37  
38 static char  *ambfname = NULL;  /* ambient file name */
38   static FILE  *ambfp = NULL;     /* ambient file pointer */
39   static int  nunflshed = 0;      /* number of unflushed ambient values */
40  
# Line 47 | Line 46 | static int  nunflshed = 0;     /* number of unflushed ambi
46  
47   extern long  ftell(), lseek();
48   static int  initambfile(), avsave(), avinsert();
49 + #ifdef  F_SETLKW
50 + static  aflock();
51 + #endif
52  
53  
54   setambres(ar)                           /* set ambient resolution */
# Line 74 | Line 76 | char  *afile;
76          AMBVAL  amb;
77                                                  /* init ambient limits */
78          setambres(ambres);
79 +        if (afile == NULL)
80 +                return;
81                                                  /* open ambient file */
82 <        if ((ambfname = afile) != NULL) {
83 <                if ((ambfp = fopen(afile, "r+")) != NULL) {
84 <                        initambfile(0);
85 <                        headlen = ftell(ambfp);
86 <                        while (readambval(&amb, ambfp))
87 <                                avinsert(&amb, &atrunk, thescene.cuorg,
88 <                                                thescene.cusize);
89 <                                                        /* align */
90 <                        fseek(ambfp, -((ftell(ambfp)-headlen)%AMBVALSIZ), 1);
91 <                } else if ((ambfp = fopen(afile, "w+")) != NULL)
92 <                        initambfile(1);
93 <                else {
94 <                        sprintf(errmsg, "cannot open ambient file \"%s\"",
91 <                                        afile);
92 <                        error(SYSTEM, errmsg);
93 <                }
94 <                nunflshed++;    /* lie */
95 <                ambsync();
82 >        if ((ambfp = fopen(afile, "r+")) != NULL) {
83 >                initambfile(0);
84 >                headlen = ftell(ambfp);
85 >                while (readambval(&amb, ambfp))
86 >                        avinsert(&amb, &atrunk, thescene.cuorg,
87 >                                        thescene.cusize);
88 >                                                /* align */
89 >                fseek(ambfp, -((ftell(ambfp)-headlen)%AMBVALSIZ), 1);
90 >        } else if ((ambfp = fopen(afile, "w+")) != NULL)
91 >                initambfile(1);
92 >        else {
93 >                sprintf(errmsg, "cannot open ambient file \"%s\"", afile);
94 >                error(SYSTEM, errmsg);
95          }
96 +        nunflshed++;    /* lie */
97 +        ambsync();
98   }
99  
100  
# Line 309 | Line 310 | int  creat;
310   {
311          extern char  *progname, *octname, VersionID[];
312  
313 + #ifdef  F_SETLKW
314 +        aflock(creat ? F_WRLCK : F_RDLCK);
315 + #endif
316   #ifdef MSDOS
317          setmode(fileno(ambfp), O_BINARY);
318   #endif
# Line 325 | Line 329 | int  creat;
329                  fputformat(AMBFMT, ambfp);
330                  putc('\n', ambfp);
331                  putambmagic(ambfp);
332 <        } else if (checkheader(ambfp, AMBFMT, NULL) < 0 || !hasambmagic(ambfp)) {
333 <                sprintf(errmsg, "bad ambient file \"%s\"", ambfname);
330 <                error(USER, errmsg);
331 <        }
332 >        } else if (checkheader(ambfp, AMBFMT, NULL) < 0 || !hasambmagic(ambfp))
333 >                error(USER, "bad ambient file");
334   }
335  
336  
# Line 346 | Line 348 | AMBVAL *av;
348                          goto writerr;
349          return;
350   writerr:
351 <        sprintf(errmsg, "error writing ambient file \"%s\"", ambfname);
350 <        error(SYSTEM, errmsg);
351 >        error(SYSTEM, "error writing ambient file");
352   }
353  
354  
# Line 388 | Line 389 | memerr:
389   }
390  
391  
392 < #ifdef  NIX
392 > #ifdef  F_SETLKW
393  
394 < int
395 < ambsync()                       /* flush ambient file */
394 > static
395 > aflock(typ)                     /* lock/unlock ambient file */
396 > int  typ;
397   {
398 <        if (nunflshed == 0)
399 <                return(0);
400 <        nunflshed = 0;
401 <        return(fflush(ambfp));
398 >        static struct flock  fls;       /* static so initialized to zeroes */
399 >
400 >        fls.l_type = typ;
401 >        if (fcntl(fileno(ambfp), F_SETLKW, &fls) < 0)
402 >                error(SYSTEM, "cannot (un)lock ambient file");
403   }
404  
402 #else
405  
406   int
407   ambsync()                       /* synchronize ambient file */
408   {
409          static FILE  *ambinp = NULL;
410          static long  lastpos = -1;
409        struct flock  fls;
411          long  flen;
412          AMBVAL  avs;
413          register int  n;
414  
415          if (nunflshed == 0)
416                  return(0);
417 <                                /* gain exclusive access */
417 <        fls.l_type = F_WRLCK;
418 <        fls.l_whence = 0;
419 <        fls.l_start = 0L;
420 <        fls.l_len = 0L;
421 <        if (fcntl(fileno(ambfp), F_SETLKW, &fls) < 0)
422 <                error(SYSTEM, "cannot lock ambient file");
423 <        if (lastpos < 0)        /* initializing */
417 >        if (lastpos < 0)        /* initializing (locked in initambfile) */
418                  goto syncend;
419 +                                /* gain exclusive access */
420 +        aflock(F_WRLCK);
421                                  /* see if file has grown */
422          if ((flen = lseek(fileno(ambfp), 0L, 2)) < 0)
423                  error(SYSTEM, "cannot seek on ambient file");
424          if (n = flen - lastpos) {               /* file has grown */
425 <                if (ambinp == NULL) {
426 <                        ambinp = fopen(ambfname, "r");
425 >                if (ambinp == NULL) {           /* use duplicate filedes */
426 >                        ambinp = fdopen(dup(fileno(ambfp)), "r");
427                          if (ambinp == NULL)
428 <                                error(SYSTEM, "fopen failed in ambsync");
428 >                                error(SYSTEM, "fdopen failed in ambsync");
429                  }
430                  if (fseek(ambinp, lastpos, 0) < 0)
431                          error(SYSTEM, "fseek failed in ambsync");
# Line 444 | Line 440 | ambsync()                      /* synchronize ambient file */
440   syncend:
441          n = fflush(ambfp);                      /* calls write() at last */
442          lastpos = lseek(fileno(ambfp), 0L, 1);
443 <        fls.l_type = F_UNLCK;                   /* release file */
448 <        fcntl(fileno(ambfp), F_SETLKW, &fls);
443 >        aflock(F_UNLCK);                        /* release file */
444          nunflshed = 0;
445          return(n);
446 + }
447 +
448 + #else
449 +
450 + int
451 + ambsync()                       /* flush ambient file */
452 + {
453 +        if (nunflshed == 0)
454 +                return(0);
455 +        nunflshed = 0;
456 +        return(fflush(ambfp));
457   }
458  
459   #endif

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines