--- ray/src/hd/holo.h 1998/08/12 17:54:15 3.15 +++ ray/src/hd/holo.h 2003/05/29 16:26:21 3.21 @@ -1,7 +1,4 @@ -/* Copyright (c) 1998 Silicon Graphics, Inc. */ - -/* SCCSid "$SunId$ SGI" */ - +/* RCSid: $Id: holo.h,v 3.21 2003/05/29 16:26:21 greg Exp $ */ /* * Header file for holodeck programs * @@ -15,6 +12,10 @@ #define HDMAX 128 /* maximum active holodeck sections */ #endif +#ifndef MAXDIRSE +#define MAXDIRSE 32 /* maximum seeks per directory write */ +#endif + #define DCINF (unsigned)((1L<<16)-1) /* special value for infinity */ #define DCLIN (unsigned)(1L<<11) /* linear depth limit */ @@ -43,7 +44,7 @@ typedef struct { typedef struct { unsigned int4 nrd; /* number of beam rays bundled on disk */ - long fo; /* position in file */ + off_t fo; /* position in file */ } BEAMI; /* beam index */ typedef struct { @@ -65,10 +66,12 @@ typedef struct holo { FVECT xv[3]; /* side vectors (second) */ int2 grid[3]; /* grid resolution (third) */ int fd; /* file descriptor */ - short dirty; /* beam index needs update to file */ + struct { + int s, n; /* dirty section start, length */ + } dirseg[MAXDIRSE+1]; /* dirty beam index segments */ + short dirty; /* number of dirty segments */ double tlin; /* linear range for depth encoding */ FVECT wg[3]; /* wall grid vectors (derived) */ - double wo[6]; /* wall grid offsets (derived) */ int wi[6]; /* wall super-indices (derived) */ char *priv; /* pointer to private client data */ BEAM **bl; /* beam pointers (memory cache) */ @@ -86,18 +89,25 @@ typedef struct { #define bnrays(hp,i) ((hp)->bl[i]!=NULL ? (hp)->bl[i]->nrm : (hp)->bi[i].nrd) -#define hdflush(hp) (hdfreebeam(hp,0) && hdsync(hp,0)) -#define hdclobber(hp) (hdkillbeam(hp,0) && hdsync(hp,0)) +#define hdflush(hp) (hdfreebeam(hp,0), hdsync(hp,0)) +#define hdclobber(hp) (hdkillbeam(hp,0), hdsync(hp,0)) extern HOLO *hdinit(), *hdalloc(); extern BEAM *hdgetbeam(); extern RAYVAL *hdnewrays(); extern unsigned hdmemuse(); -extern long hdfiluse(), hdfilen(), hdallocfrag(); +extern off_t hdfiluse(), hdfilen(), hdallocfrag(); extern double hdray(), hdinter(); extern unsigned hdcode(); extern int hdfilord(); +#define FF_NEVER 0 /* never free fragments */ +#define FF_WRITE 01 /* free fragment on write */ +#define FF_ALLOC 02 /* free fragment on ray alloc */ +#define FF_READ 04 /* free fragment on read */ +#define FF_KILL 010 /* free fragment on beam kill */ + +extern int hdfragflags; /* tells when to free fragments */ extern unsigned hdcachesize; /* target cache size (bytes) */ extern unsigned long hdclock; /* holodeck system clock */ extern HOLO *hdlist[HDMAX+1]; /* holodeck pointers (NULL term.) */ @@ -114,7 +124,7 @@ extern int hdwg1[6]; /* wall grid 1 index */ #define HOLOFMT "Holodeck" /* file format identifier */ #define HOLOVERS 0 /* file format version number */ -#define HOLOMAGIC (323+sizeof(long)+8*HOLOVERS) /* file magic number */ +#define HOLOMAGIC (323+sizeof(off_t)+8*HOLOVERS) /* file magic number */ /* * A holodeck file consists of an information header terminated by a