--- ray/src/rt/ambient.c 1993/01/20 10:48:23 2.15 +++ ray/src/rt/ambient.c 1993/01/26 09:08:20 2.17 @@ -35,8 +35,8 @@ double minarad; /* minimum ambient radius */ static AMBTREE atrunk; /* our ambient trunk node */ -static char *ambfname = NULL; /* ambient file name */ static FILE *ambfp = NULL; /* ambient file pointer */ +static int nunflshed = 0; /* number of unflushed ambient values */ #define AMBFLUSH (BUFSIZ/AMBVALSIZ) @@ -45,7 +45,7 @@ static FILE *ambfp = NULL; /* ambient file pointer */ #define newambtree() (AMBTREE *)calloc(8, sizeof(AMBTREE)) extern long ftell(), lseek(); -static int initambfile(), avsave(), avinsert(), ambsync(); +static int initambfile(), avsave(), avinsert(); setambres(ar) /* set ambient resolution */ @@ -74,7 +74,7 @@ char *afile; /* init ambient limits */ setambres(ambres); /* open ambient file */ - if ((ambfname = afile) != NULL) + if (afile != NULL) { if ((ambfp = fopen(afile, "r+")) != NULL) { initambfile(0); headlen = ftell(ambfp); @@ -90,6 +90,9 @@ char *afile; afile); error(SYSTEM, errmsg); } + nunflshed++; /* lie */ + ambsync(); + } } @@ -323,7 +326,6 @@ int creat; putambmagic(ambfp); } else if (checkheader(ambfp, AMBFMT, NULL) < 0 || !hasambmagic(ambfp)) error(USER, "bad ambient file"); - ambsync(); } @@ -331,18 +333,14 @@ static avsave(av) /* insert and save an ambient value */ AMBVAL *av; { - static int nunflshed = 0; - avinsert(av, &atrunk, thescene.cuorg, thescene.cusize); if (ambfp == NULL) return; if (writambval(av, ambfp) < 0) goto writerr; - if (++nunflshed >= AMBFLUSH) { + if (++nunflshed >= AMBFLUSH) if (ambsync() == EOF) goto writerr; - nunflshed = 0; - } return; writerr: error(SYSTEM, "error writing ambient file"); @@ -388,15 +386,18 @@ memerr: #ifdef NIX -static +int ambsync() /* flush ambient file */ { + if (nunflshed == 0) + return(0); + nunflshed = 0; return(fflush(ambfp)); } #else -static +int ambsync() /* synchronize ambient file */ { static FILE *ambinp = NULL; @@ -405,6 +406,9 @@ ambsync() /* synchronize ambient file */ long flen; AMBVAL avs; register int n; + + if (nunflshed == 0) + return(0); /* gain exclusive access */ fls.l_type = F_WRLCK; fls.l_whence = 0; @@ -418,10 +422,10 @@ ambsync() /* synchronize ambient file */ if ((flen = lseek(fileno(ambfp), 0L, 2)) < 0) error(SYSTEM, "cannot seek on ambient file"); if (n = flen - lastpos) { /* file has grown */ - if (ambinp == NULL) { - ambinp = fopen(ambfname, "r"); + if (ambinp == NULL) { /* use duplicate filedes */ + ambinp = fdopen(dup(fileno(ambfp)), "r"); if (ambinp == NULL) - error(SYSTEM, "fopen failed in ambsync"); + error(SYSTEM, "fdopen failed in ambsync"); } if (fseek(ambinp, lastpos, 0) < 0) error(SYSTEM, "fseek failed in ambsync"); @@ -438,6 +442,7 @@ syncend: lastpos = lseek(fileno(ambfp), 0L, 1); fls.l_type = F_UNLCK; /* release file */ fcntl(fileno(ambfp), F_SETLKW, &fls); + nunflshed = 0; return(n); }