--- ray/src/rt/ambient.c 2005/08/22 16:07:26 2.62 +++ ray/src/rt/ambient.c 2007/09/15 02:47:30 2.65 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: ambient.c,v 2.62 2005/08/22 16:07:26 greg Exp $"; +static const char RCSid[] = "$Id: ambient.c,v 2.65 2007/09/15 02:47:30 greg Exp $"; #endif /* * ambient.c - routines dealing with ambient (inter-reflected) component. @@ -192,8 +192,7 @@ setambient(void) /* initialize calculation */ sprintf(errmsg, "cannot open ambient file \"%s\"", ambfile); error(SYSTEM, errmsg); } - nunflshed++; /* lie */ - ambsync(); + ambsync(); /* load previous values */ } @@ -877,12 +876,12 @@ ambsync(void) /* synchronize ambient file */ AMBVAL avs; register int n; - if (nunflshed == 0) + if (ambfp == NULL) /* no ambient file? */ return(0); if (lastpos < 0) /* initializing (locked in initambfile) */ goto syncend; - /* gain exclusive access */ - aflock(F_WRLCK); + /* gain appropriate access */ + aflock(nunflshed ? F_WRLCK : F_RDLCK); /* see if file has grown */ if ((flen = lseek(fileno(ambfp), (off_t)0, SEEK_END)) < 0) goto seekerr; @@ -905,9 +904,10 @@ ambsync(void) /* synchronize ambient file */ avinsert(avstore(&avs)); n -= AMBVALSIZ; } + lastpos = flen - n; /*** seek always as safety measure if (n) ***/ /* alignment */ - if (lseek(fileno(ambfp), (off_t)(flen-n), SEEK_SET) < 0) + if (lseek(fileno(ambfp), (off_t)lastpos, SEEK_SET) < 0) goto seekerr; } #ifdef DEBUG @@ -920,8 +920,11 @@ ambsync(void) /* synchronize ambient file */ #endif syncend: n = fflush(ambfp); /* calls write() at last */ - if ((lastpos = lseek(fileno(ambfp), (off_t)0, SEEK_CUR)) < 0) - goto seekerr; + if ((n == EOF) | (lastpos < 0)) { + if ((lastpos = lseek(fileno(ambfp), (off_t)0, SEEK_CUR)) < 0) + goto seekerr; + } else + lastpos += (long)nunflshed*AMBVALSIZ; aflock(F_UNLCK); /* release file */ nunflshed = 0; return(n); @@ -935,7 +938,7 @@ seekerr: extern int ambsync(void) /* flush ambient file */ { - if (nunflshed == 0) + if (ambfp == NULL) return(0); nunflshed = 0; return(fflush(ambfp));