ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/hd/rholo.c
(Generate patch)

Comparing ray/src/hd/rholo.c (file contents):
Revision 3.61 by greg, Mon Oct 20 16:01:55 2003 UTC vs.
Revision 3.74 by greg, Fri Dec 5 00:22:33 2008 UTC

# Line 5 | Line 5 | static const char      RCSid[] = "$Id$";
5   * Radiance holodeck generation controller
6   */
7  
8 + #include <stdio.h>
9 + #include <time.h>
10   #include <signal.h>
11   #include <sys/stat.h>
12   #include <string.h>
13  
12 #include "rholo.h"
14   #include "platform.h"
15 + #include "rterror.h"
16 + #include "resolu.h"
17 + #include "rholo.h"
18   #include "random.h"
19  
20   #ifndef FRAGWARN
21   #define FRAGWARN        20              /* fragmentation for warning (%) */
22   #endif
23   #ifndef MAXQTIME
24 < #define MAXQTIME        5               /* target maximum seconds in queue */
24 > #define MAXQTIME        3               /* target maximum seconds in queue */
25   #endif
26                                          /* manual cache flushing frequency */
27   #ifndef RTFLUSH
# Line 65 | Line 69 | char  *sigerr[NSIG];           /* signal error messages */
69  
70   extern int      nowarn;         /* turn warnings off? */
71  
72 < extern time_t   time();
72 > static void onsig(int  signo);
73 > static void sigdie(int  signo, char  *msg);
74 > static int resfmode(int fd, int mod);
75 > static void initrholo(void);
76 > static int rholo(void);
77 > static void setdefaults(HDGRID  *gp);
78 > static void creatholo(HDGRID    *gp);
79 > static gethfunc headline;
80 > static void loadholo(void);
81 > static void rootname(char       *rn, char       *fn);
82 > static void badvalue(int        vc);
83  
84  
85 < main(argc, argv)
86 < int     argc;
87 < char    *argv[];
85 > int
86 > main(
87 >        int     argc,
88 >        char    *argv[]
89 > )
90   {
91          int     i;
92  
77        initurand(16384);                       /* initialize urand */
93          progname = argv[0];                     /* get arguments */
94          for (i = 1; i < argc && argv[i][0] == '-'; i++)
95                  switch (argv[i][1]) {
# Line 149 | Line 164 | char   *argv[];
164          quit(0);
165   userr:
166          fprintf(stderr,
167 < "Usage: %s [-n nprocs][-o disp][-w][-r|-f] output.hdk [control.hif|+|- [VAR=val ..]]\n",
167 > "Usage: %s [-n nprocs][-o disp][-i][-w][-r|-f] output.hdk [control.hif|+|- [VAR=val ..]]\n",
168                          progname);
169          quit(1);
170 +        return 1; /* pro forma return */
171   }
172  
173  
174 < void
175 < onsig(signo)                            /* fatal signal */
176 < int  signo;
174 > static void
175 > onsig(                          /* fatal signal */
176 >        int  signo
177 > )
178   {
179          static int  gotsig = 0;
180  
# Line 175 | Line 192 | int  signo;
192   }
193  
194  
195 < sigdie(signo, msg)                      /* set fatal signal */
196 < int  signo;
197 < char  *msg;
195 > static void
196 > sigdie(                 /* set fatal signal */
197 >        int  signo,
198 >        char  *msg
199 > )
200   {
201          if (signal(signo, onsig) == SIG_IGN)
202                  signal(signo, SIG_IGN);
# Line 185 | Line 204 | char  *msg;
204   }
205  
206  
207 < int
208 < resfmode(fd, mod)               /* restrict open file access mode */
209 < int     fd, mod;
207 > static int
208 > resfmode(               /* restrict open file access mode */
209 >        int     fd,
210 >        int     mod
211 > )
212   {
213          struct stat     stbuf;
214                                          /* get original mode */
# Line 205 | Line 226 | int    fd, mod;
226   }
227  
228  
229 < initrholo()                     /* get our holodeck running */
229 > static void
230 > initrholo(void)                 /* get our holodeck running */
231   {
232          extern int      global_packet();
233          register int    i;
# Line 270 | Line 292 | initrholo()                    /* get our holodeck running */
292          }
293                                          /* set up signal handling */
294          sigdie(SIGINT, "Interrupt");
273        sigdie(SIGHUP, "Hangup");
295          sigdie(SIGTERM, "Terminate");
296 + #ifdef SIGHUP
297 +        sigdie(SIGHUP, "Hangup");
298 + #endif
299 + #ifdef SIGPIPE
300          sigdie(SIGPIPE, "Broken pipe");
301 + #endif
302 + #ifdef SIGALRM
303          sigdie(SIGALRM, "Alarm clock");
304 + #endif
305   #ifdef  SIGXCPU
306          sigdie(SIGXCPU, "CPU limit exceeded");
307 + #endif
308 + #ifdef  SIGXFSZ
309          sigdie(SIGXFSZ, "File size exceeded");
310   #endif
311                                          /* protect holodeck file */
# Line 286 | Line 316 | memerr:
316   }
317  
318  
319 < rholo()                         /* holodeck main loop */
319 > static int
320 > rholo(void)                             /* holodeck main loop */
321   {
322 <        static long     nextfragwarn = 100*(1L<<20);
322 >        static off_t    nextfragwarn = 100L<<20;
323          static int      idle = 0;
324          PACKET  *pl = NULL, *plend;
325          off_t   fsiz;
# Line 307 | Line 338 | rholo()                                /* holodeck main loop */
338                  return(0);              /* all done */
339          fsiz = hdfilen(hdlist[0]->fd);  /* check file size */
340          if (maxdisk > 0 && fsiz >= maxdisk) {
341 <                error(WARNING, "file limit exceeded");
341 >                error(USER, "file limit exceeded");
342                  done_rtrace();
343                  return(1);      /* comes back */
344          }
345   #if FRAGWARN
346 <        if (fsiz >= nextfragwarn &&
347 <                (fsiz-hdfiluse(hdlist[0]->fd,0))/(fsiz/100) > FRAGWARN) {
348 <                sprintf(errmsg, "holodeck file fragmentation is %.0f%%",
349 <                                100.*(fsiz-hdfiluse(hdlist[0]->fd,1))/fsiz);
350 <                error(WARNING, errmsg);
351 <                nextfragwarn = fsiz + (fsiz>>2);        /* decent interval */
346 >        if (fsiz >= nextfragwarn) {
347 >                double  pctfrag = 100.*(fsiz-hdfiluse(hdlist[0]->fd))/fsiz;
348 >                if (pctfrag >= (double)FRAGWARN) {
349 >                        sprintf(errmsg, "holodeck file fragmentation is %.0f%%",
350 >                                        pctfrag);
351 >                        error(WARNING, errmsg);
352 >                        nextfragwarn = fsiz + (fsiz>>2);
353 >                } else
354 >                        nextfragwarn = fsiz + (10L<<20);
355          }
356   #endif
357          t = time(NULL);                 /* check time */
358          if (endtime > 0 && t >= endtime) {
359 <                error(WARNING, "time limit exceeded");
359 >                error(USER, "time limit exceeded");
360                  done_rtrace();
361                  return(1);      /* comes back */
362          }
# Line 355 | Line 389 | rholo()                                /* holodeck main loop */
389   }
390  
391  
392 < setdefaults(gp)                 /* set default values */
393 < register HDGRID *gp;
392 > static void
393 > setdefaults(                    /* set default values */
394 >        register HDGRID *gp
395 > )
396   {
397          extern char     *atos();
398          register int    i;
399          int     n;
400          double  len[3], d;
365        char    buf[64];
401  
402          if (!vdef(SECTION)) {
403                  sprintf(errmsg, "%s must be defined", vnam(SECTION));
# Line 412 | Line 447 | register HDGRID        *gp;
447   }
448  
449  
450 < creatholo(gp)                   /* create a holodeck output file */
451 < HDGRID  *gp;
450 > static void
451 > creatholo(                      /* create a holodeck output file */
452 >        HDGRID  *gp
453 > )
454   {
455          extern char     VersionID[];
456          int32   lastloc, nextloc;
# Line 451 | Line 488 | HDGRID *gp;
488   }
489  
490  
491 < int
492 < headline(s)                     /* process information header line */
493 < char    *s;
491 > static int
492 > headline(                       /* process information header line */
493 >        char    *s,
494 >        void    *p
495 > )
496   {
497          extern char     FMTSTR[];
498          register char   *cp;
# Line 477 | Line 516 | char   *s;
516   }
517  
518  
519 < loadholo()                      /* start loading a holodeck from fname */
519 > static void
520 > loadholo(void)                  /* start loading a holodeck from fname */
521   {
522          FILE    *fp;
523          int     fd;
# Line 494 | Line 534 | loadholo()                     /* start loading a holodeck from fname */
534                          error(SYSTEM, errmsg);
535                  }
536                  if (ncprocs > 0) {
537 <                        sprintf(errmsg,
538 <                        "\"%s\" opened read-only; new rays will be discarded",
539 <                                        hdkfile);
537 >                        sprintf(errmsg, "\"%s\" is read-only", hdkfile);
538 >                        if (outdev == NULL)
539 >                                error(USER, errmsg);
540 >                        strcat(errmsg, "; new rays will be discarded");
541                          error(WARNING, errmsg);
542                          force = -1;
543                  }
# Line 525 | Line 566 | loadholo()                     /* start loading a holodeck from fname */
566   }
567  
568  
569 < done_packets(pl)                /* handle finished packets */
570 < PACKET  *pl;
569 > extern void
570 > done_packets(           /* handle finished packets */
571 >        PACKET  *pl
572 > )
573   {
574          static int      n2flush = 0;
575          register PACKET *p;
# Line 558 | Line 601 | PACKET *pl;
601   }
602  
603  
604 < rootname(rn, fn)                /* remove tail from end of fn */
605 < register char   *rn, *fn;
604 > static void
605 > rootname(               /* remove tail from end of fn */
606 >        register char   *rn,
607 >        register char   *fn
608 > )
609   {
610          char    *tp, *dp;
611  
# Line 574 | Line 620 | register char  *rn, *fn;
620   }
621  
622  
623 < badvalue(vc)                    /* report bad variable value and exit */
624 < int     vc;
623 > static void
624 > badvalue(                       /* report bad variable value and exit */
625 >        int     vc
626 > )
627   {
628          sprintf(errmsg, "bad value for variable '%s'", vnam(vc));
629          error(USER, errmsg);
# Line 614 | Line 662 | int    ec;
662                  if ((ncprocs > 0) & (force >= 0) && vdef(REPORT)) {
663                          off_t   fsiz, fuse;
664                          fsiz = hdfilen(hdlist[0]->fd);
665 <                        fuse = hdfiluse(hdlist[0]->fd, 1);
665 >                        fuse = hdfiluse(hdlist[0]->fd);
666                          fprintf(stderr,
667                          "%s: %.1f Mbyte holodeck file, %.1f%% fragmentation\n",
668                                          hdkfile, fsiz/(1024.*1024.),

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines