--- ray/src/hd/rholo.c 1997/10/31 15:49:23 3.3 +++ ray/src/hd/rholo.c 1997/11/06 09:49:24 3.6 @@ -127,9 +127,9 @@ initrholo() /* get our holodeck running */ { extern int global_packet(); register int i; - /* check output device */ - if (outdev != NULL) - open_display(outdev); + + if (outdev != NULL) /* open output device */ + disp_open(outdev); else if (ncprocs > 0) /* else use global ray feed */ init_global(); /* record end time */ @@ -138,7 +138,10 @@ initrholo() /* get our holodeck running */ else endtime = starttime + vflt(TIME)*3600.; /* set up memory cache */ - hdcachesize = 1024.*1024.*vflt(CACHE); + if (outdev == NULL) + hdcachesize = 0; /* manual flushing */ + else if (vdef(CACHE)) + hdcachesize = 1024.*1024.*vflt(CACHE); /* open report file */ if (vdef(REPORT)) { register char *s = sskip2(vval(REPORT), 1); @@ -187,9 +190,10 @@ rholo() /* holodeck main loop */ register PACKET *p; time_t t; long l; - /* check display */ - if (outdev != NULL && !disp_check(idle)) - return(0); + + if (outdev != NULL) /* check display */ + if (!disp_check(idle)) + return(0); /* display only? */ if (ncprocs <= 0) return(1); @@ -294,14 +298,6 @@ register HDGRID *gp; vval(DISKSPACE) = "100"; vdef(DISKSPACE)++; } - if (!vdef(CACHE)) { - sprintf(errmsg, - "no %s setting, assuming 10 Mbytes available", - vnam(CACHE)); - error(WARNING, errmsg); - vval(CACHE) = "10"; - vdef(CACHE)++; - } if (!vdef(OBSTRUCTIONS)) { vval(OBSTRUCTIONS) = "T"; vdef(OBSTRUCTIONS)++; @@ -367,9 +363,10 @@ loadholo() /* start loading a holodeck from fname */ { FILE *fp; long endloc; - /* open input file */ - if ((fp = fopen(hdkfile, "r+")) == NULL) { - sprintf(errmsg, "cannot open \"%s\" for appending", hdkfile); + /* open holodeck file */ + if ((fp = fopen(hdkfile, ncprocs>0 ? "r+" : "r")) == NULL) { + sprintf(errmsg, "cannot open \"%s\" for %s", hdkfile, + ncprocs>0 ? "appending" : "reading"); error(SYSTEM, errmsg); } /* load variables from header */ @@ -392,6 +389,7 @@ loadholo() /* start loading a holodeck from fname */ done_packets(pl) /* handle finished packets */ PACKET *pl; { + static int nunflushed = 0; register PACKET *p; while (pl != NULL) { @@ -402,13 +400,19 @@ PACKET *pl; p->nr*sizeof(RAYVAL)); if (outdev != NULL) /* display it */ disp_packet(p); + else + nunflushed += p->nr; + nraysdone += p->nr; + npacksdone++; } - nraysdone += p->nr; - npacksdone++; p->nr = 0; /* push onto free list */ p->next = freepacks; freepacks = p; } + if (nunflushed >= 256*RPACKSIZ) { + hdflush(NULL); /* flush holodeck buffers */ + nunflushed = 0; + } } @@ -514,6 +518,8 @@ int ec; { int status = 0; + if (outdev != NULL) /* close display */ + disp_close(); if (hdlist[0] != NULL) { /* flush holodeck */ if (ncprocs > 0) { done_packets(flush_queue());