| 21 |
|
#ifndef PCTFREE |
| 22 |
|
#define PCTFREE 15 /* maximum fraction to free (%) */ |
| 23 |
|
#endif |
| 24 |
< |
#ifndef MAXFRAG |
| 25 |
< |
#define MAXFRAG 32767 /* maximum fragments/file to track (0==inf) */ |
| 24 |
> |
#ifndef MAXFRAGB |
| 25 |
> |
#define MAXFRAGB 16 /* fragment blocks/file to track (0==inf) */ |
| 26 |
|
#endif |
| 27 |
+ |
#ifndef MINDIRSEL |
| 28 |
+ |
/* minimum directory seek length */ |
| 29 |
+ |
#define MINDIRSEL (4*BUFSIZ/sizeof(BEAMI)) |
| 30 |
+ |
#endif |
| 31 |
|
|
| 32 |
|
#ifndef BSD |
| 33 |
|
#define write writebuf /* safe i/o routines */ |
| 34 |
|
#define read readbuf |
| 35 |
|
#endif |
| 36 |
|
|
| 37 |
< |
#define FRAGBLK 256 /* number of fragments to allocate at a time */ |
| 37 |
> |
#define FRAGBLK 512 /* number of fragments to allocate at a time */ |
| 38 |
|
|
| 39 |
|
unsigned hdcachesize = CACHESIZE*1024*1024; /* target cache size */ |
| 40 |
|
unsigned long hdclock; /* clock value */ |
| 208 |
|
} |
| 209 |
|
copystruct(hp->dirseg+j, hp->dirseg+(j-1)); |
| 210 |
|
} |
| 211 |
< |
mindist = nbeams(hp); /* find closest neighbors */ |
| 212 |
< |
for (j = hp->dirty; --j; ) |
| 213 |
< |
if (hp->dirseg[j].s - (hp->dirseg[j-1].s + hp->dirseg[j-1].n) |
| 214 |
< |
< mindist) { |
| 215 |
< |
mindist = hp->dirseg[j].s - |
| 211 |
> |
do { /* check neighbors */ |
| 212 |
> |
mindist = nbeams(hp); /* find closest */ |
| 213 |
> |
for (j = hp->dirty; --j; ) |
| 214 |
> |
if (hp->dirseg[j].s - |
| 215 |
> |
(hp->dirseg[j-1].s + hp->dirseg[j-1].n) |
| 216 |
> |
< mindist) { |
| 217 |
> |
minpos = j; |
| 218 |
> |
mindist = hp->dirseg[j].s - |
| 219 |
|
(hp->dirseg[j-1].s + hp->dirseg[j-1].n); |
| 220 |
< |
minpos = j; |
| 221 |
< |
} |
| 222 |
< |
if (hp->dirty > MAXDIRSE || mindist <= BUFSIZ/sizeof(BEAMI)) { |
| 220 |
> |
} |
| 221 |
> |
/* good enough? */ |
| 222 |
> |
if (hp->dirty <= MAXDIRSE && mindist > MINDIRSEL) |
| 223 |
> |
break; |
| 224 |
|
j = minpos - 1; /* coalesce neighbors */ |
| 225 |
|
if (hp->dirseg[j].s + hp->dirseg[j].n < |
| 226 |
< |
hp->dirseg[minpos].s + hp->dirseg[minpos].n) { |
| 226 |
> |
hp->dirseg[minpos].s + hp->dirseg[minpos].n) |
| 227 |
|
hp->dirseg[j].n = hp->dirseg[minpos].s + |
| 228 |
|
hp->dirseg[minpos].n - hp->dirseg[j].s; |
| 229 |
< |
} |
| 230 |
< |
hp->dirty--; /* close the gap */ |
| 223 |
< |
for (j = minpos; j < hp->dirty; j++) |
| 229 |
> |
hp->dirty--; |
| 230 |
> |
while (++j < hp->dirty) /* close the gap */ |
| 231 |
|
copystruct(hp->dirseg+j, hp->dirseg+(j+1)); |
| 232 |
< |
} |
| 232 |
> |
} while (mindist <= MINDIRSEL); |
| 233 |
|
} |
| 234 |
|
|
| 235 |
|
|
| 501 |
|
f->nfrags = j; |
| 502 |
|
} |
| 503 |
|
j = f->nfrags++; /* allocate a slot in free list */ |
| 504 |
< |
#if MAXFRAG |
| 505 |
< |
if (j >= MAXFRAG-1) |
| 506 |
< |
f->nfrags--; |
| 504 |
> |
#if MAXFRAGB |
| 505 |
> |
if (j >= MAXFRAGB*FRAGBLK) { |
| 506 |
> |
f->nfrags = j--; /* stop list growth */ |
| 507 |
> |
if (bi->nrd <= f->fi[j].nrd) |
| 508 |
> |
return; /* new one no better than discard */ |
| 509 |
> |
} |
| 510 |
|
#endif |
| 511 |
|
if (j % FRAGBLK == 0) { /* more free list space */ |
| 512 |
|
register BEAMI *newp; |