Back to index

radiance  4R0+20100331
Defines | Functions | Variables
rtmain.c File Reference
#include "copyright.h"
#include <signal.h>
#include "platform.h"
#include "rtprocess.h"
#include "resolu.h"
#include "ray.h"
#include "source.h"
#include "ambient.h"
#include "random.h"
#include "paths.h"

Go to the source code of this file.

Defines

#define MAXMODLIST   1024 /* maximum modifiers we'll track */
#define check(ol, al)
#define bool(olen, var)

Functions

char * formstr ()
void tranotify (OBJECT obj)
static void onsig (int signo)
static void sigdie (int signo, char *msg)
static void printdefaults (void)
int main (int argc, char *argv[])
void wputs (char *s)
void eputs (register char *s)

Variables

static const char RCSid [] = "$Id: rtmain.c,v 2.20 2009/12/13 19:39:51 greg Exp $"
char * progname
char * shm_boundary
char * sigerr [NSIG]
char * errfile = NULL
int nproc = 1
int inform = 'a'
int outform = 'a'
char * outvals = "v"
int hresolu = 0
int vresolu = 0
int imm_irrad = 0
int lim_dist = 0
void(* addobjnotify [])()
char * tralist [MAXMODLIST]
int traincl = -1
static int loadflags = ~IO_FILES

Define Documentation

#define bool (   olen,
  var 
)
Value:
switch (argv[i][olen]) { \
                            case '\0': var = !var; break; \
                            case 'y': case 'Y': case 't': case 'T': \
                            case '+': case '1': var = 1; break; \
                            case 'n': case 'N': case 'f': case 'F': \
                            case '-': case '0': var = 0; break; \
                            default: goto badopt; }
#define check (   ol,
  al 
)
Value:
if (argv[i][ol] || \
                            badarg(argc-i-1,argv+i+1,al)) \
                            goto badopt
#define MAXMODLIST   1024 /* maximum modifiers we'll track */

Definition at line 49 of file rtmain.c.


Function Documentation

void eputs ( register char *  s)

Definition at line 401 of file rtmain.c.

{
       static int  midline = 0;

       if (!*s)
              return;
       if (!midline++) {
              fputs(progname, stderr);
              fputs(": ", stderr);
       }
       fputs(s, stderr);
       if (s[strlen(s)-1] == '\n') {
              fflush(stderr);
              midline = 0;
       }
}
char* formstr ( )
int main ( int  argc,
char *  argv[] 
)

Definition at line 66 of file rtmain.c.

{
#define        check(ol,al)        if (argv[i][ol] || \
                            badarg(argc-i-1,argv+i+1,al)) \
                            goto badopt
#define        bool(olen,var)             switch (argv[i][olen]) { \
                            case '\0': var = !var; break; \
                            case 'y': case 'Y': case 't': case 'T': \
                            case '+': case '1': var = 1; break; \
                            case 'n': case 'N': case 'f': case 'F': \
                            case '-': case '0': var = 0; break; \
                            default: goto badopt; }
       int  persist = 0;
       char  *octnm = NULL;
       char  **tralp;
       int  duped1;
       int  rval;
       int  i;
                                   /* global program name */
       progname = argv[0] = fixargv0(argv[0]);
                                   /* add trace notify function */
       for (i = 0; addobjnotify[i] != NULL; i++)
              ;
       addobjnotify[i] = tranotify;
                                   /* set our defaults */
       rand_samp = 1;
       maxdepth = -10;
       minweight = 2e-3;
                                   /* option city */
       for (i = 1; i < argc; i++) {
                                          /* expand arguments */
              while ((rval = expandarg(&argc, &argv, i)) > 0)
                     ;
              if (rval < 0) {
                     sprintf(errmsg, "cannot expand '%s'", argv[i]);
                     error(SYSTEM, errmsg);
              }
              if (argv[i] == NULL || argv[i][0] != '-')
                     break;               /* break from options */
              if (!strcmp(argv[i], "-version")) {
                     puts(VersionID);
                     quit(0);
              }
              if (!strcmp(argv[i], "-defaults") ||
                            !strcmp(argv[i], "-help")) {
                     printdefaults();
                     quit(0);
              }
              rval = getrenderopt(argc-i, argv+i);
              if (rval >= 0) {
                     i += rval;
                     continue;
              }
              switch (argv[i][1]) {
              case 'n':                          /* number of cores */
                     check(2,"i");
                     nproc = atoi(argv[++i]);
                     if (nproc <= 0)
                            error(USER, "bad number of processes");
                     break;
              case 'x':                          /* x resolution */
                     check(2,"i");
                     hresolu = atoi(argv[++i]);
                     break;
              case 'y':                          /* y resolution */
                     check(2,"i");
                     vresolu = atoi(argv[++i]);
                     break;
              case 'w':                          /* warnings */
                     rval = erract[WARNING].pf != NULL;
                     bool(2,rval);
                     if (rval) erract[WARNING].pf = wputs;
                     else erract[WARNING].pf = NULL;
                     break;
              case 'e':                          /* error file */
                     check(2,"s");
                     errfile = argv[++i];
                     break;
              case 'l':                          /* limit distance */
                     if (argv[i][2] != 'd')
                            goto badopt;
                     bool(3,lim_dist);
                     break;
              case 'I':                          /* immed. irradiance */
                     bool(2,imm_irrad);
                     break;
              case 'f':                          /* format i/o */
                     switch (argv[i][2]) {
                     case 'a':                          /* ascii */
                     case 'f':                          /* float */
                     case 'd':                          /* double */
                            inform = argv[i][2];
                            break;
                     default:
                            goto badopt;
                     }
                     switch (argv[i][3]) {
                     case '\0':
                            outform = inform;
                            break;
                     case 'a':                          /* ascii */
                     case 'f':                          /* float */
                     case 'd':                          /* double */
                     case 'c':                          /* color */
                            check(4,"");
                            outform = argv[i][3];
                            break;
                     default:
                            goto badopt;
                     }
                     break;
              case 'o':                          /* output */
                     outvals = argv[i]+2;
                     break;
              case 'h':                          /* header output */
                     rval = loadflags & IO_INFO;
                     bool(2,rval);
                     loadflags = rval ? loadflags | IO_INFO :
                                   loadflags & ~IO_INFO;
                     break;
              case 't':                          /* trace */
                     switch (argv[i][2]) {
                     case 'i':                          /* include */
                     case 'I':
                            check(3,"s");
                            if (traincl != 1) {
                                   traincl = 1;
                                   tralp = tralist;
                            }
                            if (argv[i][2] == 'I') {    /* file */
                                   rval = wordfile(tralp,
                                   getpath(argv[++i],getrlibpath(),R_OK));
                                   if (rval < 0) {
                                          sprintf(errmsg,
                            "cannot open trace include file \"%s\"",
                                                        argv[i]);
                                          error(SYSTEM, errmsg);
                                   }
                                   tralp += rval;
                            } else {
                                   *tralp++ = argv[++i];
                                   *tralp = NULL;
                            }
                            break;
                     case 'e':                          /* exclude */
                     case 'E':
                            check(3,"s");
                            if (traincl != 0) {
                                   traincl = 0;
                                   tralp = tralist;
                            }
                            if (argv[i][2] == 'E') {    /* file */
                                   rval = wordfile(tralp,
                                   getpath(argv[++i],getrlibpath(),R_OK));
                                   if (rval < 0) {
                                          sprintf(errmsg,
                            "cannot open trace exclude file \"%s\"",
                                                        argv[i]);
                                          error(SYSTEM, errmsg);
                                   }
                                   tralp += rval;
                            } else {
                                   *tralp++ = argv[++i];
                                   *tralp = NULL;
                            }
                            break;
                     default:
                            goto badopt;
                     }
                     break;
#ifdef  PERSIST
              case 'P':                          /* persist file */
                     if (argv[i][2] == 'P') {
                            check(3,"s");
                            persist = PARALLEL;
                     } else {
                            check(2,"s");
                            persist = PERSIST;
                     }
                     persistfile(argv[++i]);
                     break;
#endif
              default:
                     goto badopt;
              }
       }
       if (nproc > 1) {
              if (persist)
                     error(USER, "multiprocessing incompatible with persist file");
              if (hresolu > 0 && hresolu < nproc)
                     error(WARNING, "number of cores should not exceed horizontal resolution");
              if (trace != NULL)
                     error(WARNING, "multiprocessing does not work properly with trace mode");
       }
                                   /* initialize object types */
       initotypes();
                                   /* initialize urand */
       if (rand_samp) {
              srandom((long)time(0));
              initurand(0);
       } else {
              srandom(0L);
              initurand(2048);
       }
                                   /* set up signal handling */
       sigdie(SIGINT, "Interrupt");
#ifdef SIGHUP
       sigdie(SIGHUP, "Hangup");
#endif
       sigdie(SIGTERM, "Terminate");
#ifdef SIGPIPE
       sigdie(SIGPIPE, "Broken pipe");
#endif
#ifdef SIGALRM
       sigdie(SIGALRM, "Alarm clock");
#endif
#ifdef SIGXCPU
       sigdie(SIGXCPU, "CPU limit exceeded");
       sigdie(SIGXFSZ, "File size exceeded");
#endif
                                   /* open error file */
       if (errfile != NULL) {
              if (freopen(errfile, "a", stderr) == NULL)
                     quit(2);
              fprintf(stderr, "**************\n*** PID %5d: ",
                            getpid());
              printargs(argc, argv, stderr);
              putc('\n', stderr);
              fflush(stderr);
       }
#ifdef NICE
       nice(NICE);                 /* lower priority */
#endif
                                   /* get octree */
       if (i == argc)
              octnm = NULL;
       else if (i == argc-1)
              octnm = argv[i];
       else
              goto badopt;
       if (octnm == NULL)
              error(USER, "missing octree argument");
                                   /* set up output */
#ifdef  PERSIST
       if (persist) {
              duped1 = dup(fileno(stdout));      /* don't lose our output */
              openheader();
       }
#endif
       if (outform != 'a')
              SET_FILE_BINARY(stdout);
       readoct(octnm, loadflags, &thescene, NULL);
       nsceneobjs = nobjects;

       if (loadflags & IO_INFO) {  /* print header */
              printargs(i, argv, stdout);
              printf("SOFTWARE= %s\n", VersionID);
              fputnow(stdout);
              fputformat(formstr(outform), stdout);
              putchar('\n');
       }

       marksources();                     /* find and mark sources */

       setambient();               /* initialize ambient calculation */

#ifdef  PERSIST
       if (persist) {
              fflush(stdout);
                                          /* reconnect stdout */
              dup2(duped1, fileno(stdout));
              close(duped1);
              if (persist == PARALLEL) {  /* multiprocessing */
                     preload_objs();             /* preload scene */
                     shm_boundary = (char *)malloc(16);
                     strcpy(shm_boundary, "SHM_BOUNDARY");
                     while ((rval=fork()) == 0) {       /* keep on forkin' */
                            pflock(1);
                            pfhold();
                            ambsync();           /* load new values */
                     }
                     if (rval < 0)
                            error(SYSTEM, "cannot fork child for persist function");
                     pfdetach();          /* parent will run then exit */
              }
       }
runagain:
       if (persist)
              dupheader();                /* send header to stdout */
#endif
                                   /* trace rays */
       rtrace(NULL, nproc);
                                   /* flush ambient file */
       ambsync();
#ifdef  PERSIST
       if (persist == PERSIST) {   /* first run-through */
              if ((rval=fork()) == 0) {   /* child loops until killed */
                     pflock(1);
                     persist = PCHILD;
              } else {                    /* original process exits */
                     if (rval < 0)
                            error(SYSTEM, "cannot fork child for persist function");
                     pfdetach();          /* parent exits */
              }
       }
       if (persist == PCHILD) {    /* wait for a signal then go again */
              pfhold();
              raynum = nrays = 0;         /* reinitialize */
              goto runagain;
       }
#endif
       quit(0);

badopt:
       sprintf(errmsg, "command line error at '%s'", argv[i]);
       error(USER, errmsg);
       return 1; /* pro forma return */

#undef check
#undef bool
}

Here is the call graph for this function:

static void onsig ( int  signo) [static]
static void printdefaults ( void  ) [static]
static void sigdie ( int  signo,
char *  msg 
) [static]

Definition at line 443 of file rtmain.c.

{
       if (signal(signo, onsig) == SIG_IGN)
              signal(signo, SIG_IGN);
       sigerr[signo] = msg;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void tranotify ( OBJECT  obj)

Definition at line 429 of file rtrace.c.

{
       static int  hitlimit = 0;
       OBJREC  *o = objptr(obj);
       char  **tralp;

       if (obj == OVOID) {         /* starting over */
              traset[0] = 0;
              hitlimit = 0;
              return;
       }
       if (hitlimit || !ismodifier(o->otype))
              return;
       for (tralp = tralist; *tralp != NULL; tralp++)
              if (!strcmp(o->oname, *tralp)) {
                     if (traset[0] >= MAXTSET) {
                            error(WARNING, "too many modifiers in trace list");
                            hitlimit++;
                            return;              /* should this be fatal? */
                     }
                     insertelem(traset, obj);
                     return;
              }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void wputs ( char *  s)

Definition at line 390 of file rtmain.c.

{
       int  lasterrno = errno;
       eputs(s);
       errno = lasterrno;
}

Here is the call graph for this function:


Variable Documentation

void(* addobjnotify[])()

Definition at line 10 of file addobjnotify.c.

char* errfile = NULL

Definition at line 33 of file rtmain.c.

int hresolu = 0

Definition at line 42 of file rtmain.c.

int imm_irrad = 0

Definition at line 45 of file rtmain.c.

int inform = 'a'

Definition at line 38 of file rtmain.c.

int lim_dist = 0

Definition at line 46 of file rtmain.c.

int loadflags = ~IO_FILES [static]

Definition at line 58 of file rtmain.c.

int nproc = 1

Definition at line 35 of file rtmain.c.

int outform = 'a'

Definition at line 39 of file rtmain.c.

char* outvals = "v"

Definition at line 40 of file rtmain.c.

char* progname

Definition at line 21 of file histo.c.

const char RCSid[] = "$Id: rtmain.c,v 2.20 2009/12/13 19:39:51 greg Exp $" [static]

Definition at line 2 of file rtmain.c.

char* shm_boundary

Definition at line 107 of file raycalls.c.

char* sigerr[NSIG]

Definition at line 32 of file rtmain.c.

int traincl = -1

Definition at line 56 of file rtmain.c.

Definition at line 55 of file rtmain.c.

int vresolu = 0

Definition at line 43 of file rtmain.c.