static void _sfwrsync() #endif { reg Sfpool_t *p; reg Sfio_t *f; reg int n; /* sync all pool heads */ for (p = _Sfpool.next; p; p = p->next) { if (p->n_sf <= 0) continue; f = p->sf[0]; if (!SFFROZEN(f) && f->next > f->data && (f->mode & SF_WRITE) && f->extent < 0) (void) _sfflsbuf(f, -1); } /* and all the ones in the discrete pool */ for (n = 0; n < _Sfpool.n_sf; ++n) { f = _Sfpool.sf[n]; if (!SFFROZEN(f) && f->next > f->data && (f->mode & SF_WRITE) && f->extent < 0) (void) _sfflsbuf(f, -1); } }
static int _sfall() #endif { reg Sfpool_t *p, *next; reg Sfio_t* f; reg int n, rv; reg int nsync, count, loop; #define MAXLOOP 3 for(loop = 0; loop < MAXLOOP; ++loop) { rv = nsync = count = 0; for(p = &_Sfpool; p; p = next) { /* find the next legitimate pool */ for(next = p->next; next; next = next->next) if(next->n_sf > 0) break; /* walk the streams for _Sfpool only */ for(n = 0; n < ((p == &_Sfpool) ? p->n_sf : 1); ++n) { count += 1; f = p->sf[n]; if(f->flags&SF_STRING ) goto did_sync; if(SFFROZEN(f)) continue; if((f->mode&SF_READ) && (f->mode&SF_SYNCED) ) goto did_sync; if((f->mode&SF_READ) && !(f->bits&SF_MMAP) && f->next == f->endb) goto did_sync; if((f->mode&SF_WRITE) && !(f->bits&SF_HOLE) && f->next == f->data) goto did_sync; if(sfsync(f) < 0) rv = -1; did_sync: nsync += 1; } } if(nsync == count) break; } return rv; }