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

Comparing ray/src/hd/holofile.c (file contents):
Revision 3.25 by gwlarson, Fri Sep 18 13:51:01 1998 UTC vs.
Revision 3.27 by gwlarson, Wed Nov 4 16:44:16 1998 UTC

# Line 48 | Line 48 | static struct fraglist {
48   static int      nhdfragls;      /* size of hdfragl array */
49  
50  
51 + char *
52 + hdrealloc(ptr, siz, rout)       /* (re)allocate memory, retry then error */
53 + char    *ptr;
54 + unsigned        siz;
55 + char    *rout;
56 + {
57 +        register char   *newp;
58 +                                        /* call malloc/realloc */
59 +        if (ptr == NULL) newp = (char *)malloc(siz);
60 +        else newp = (char *)realloc(ptr, siz);
61 +                                        /* check success */
62 +        if (newp == NULL && rout != NULL) {
63 +                hdfreecache(25, NULL);  /* free some memory */
64 +                errno = 0;              /* retry */
65 +                newp = hdrealloc(ptr, siz, NULL);
66 +                if (newp == NULL) {     /* give up and report error */
67 +                        sprintf(errmsg, "out of memory in %s", rout);
68 +                        error(SYSTEM, errmsg);
69 +                }
70 +        }
71 +        return(newp);
72 + }
73 +
74 +
75   hdattach(fd)            /* start tracking file fragments for some section */
76   register int    fd;
77   {
78          if (fd >= nhdfragls) {
79 <                if (nhdfragls)
80 <                        hdfragl = (struct fraglist *)realloc((char *)hdfragl,
57 <                                        (fd+1)*sizeof(struct fraglist));
58 <                else
59 <                        hdfragl = (struct fraglist *)malloc(
60 <                                        (fd+1)*sizeof(struct fraglist));
61 <                if (hdfragl == NULL)
62 <                        error(SYSTEM, "out of memory in hdattach");
79 >                hdfragl = (struct fraglist *)hdrealloc((char *)hdfragl,
80 >                                (fd+1)*sizeof(struct fraglist), "hdattach");
81                  bzero((char *)(hdfragl+nhdfragls),
82                                  (fd+1-nhdfragls)*sizeof(struct fraglist));
83                  nhdfragls = fd+1;
# Line 148 | Line 166 | HDGRID *hproto;                /* holodeck section grid */
166          biglob(hp)->nrd = rtrunc = 0;
167          for (n = hproto == NULL ? nbeams(hp) : 0; n > 0; n--)
168                  if (hp->bi[n].nrd)
169 <                        if (hp->bi[n].fo + hp->bi[n].nrd > fpos) {
169 >                        if (hp->bi[n].fo+hp->bi[n].nrd*sizeof(RAYVAL) > fpos) {
170                                  rtrunc += hp->bi[n].nrd;
171                                  hp->bi[n].nrd = 0;
172                          } else
# Line 292 | Line 310 | int    nr;                     /* number of new rays desired */
310                  hp->bl[i]->tick = hdclock;      /* preempt swap */
311          if (hdcachesize > 0 && hdmemuse(0) >= hdcachesize)
312                  hdfreecache(PCTFREE, NULL);     /* free some space */
295        errno = 0;
313          if (hp->bl[i] == NULL) {                /* allocate (and load) */
314                  n = hp->bi[i].nrd + nr;
315 <                if ((hp->bl[i] = (BEAM *)malloc(hdbsiz(n))) == NULL)
299 <                        goto memerr;
315 >                hp->bl[i] = (BEAM *)hdrealloc(NULL, hdbsiz(n), "hdnewrays");
316                  blglob(hp)->nrm += n;
317                  if (n = hp->bl[i]->nrm = hp->bi[i].nrd) {
318 +                        errno = 0;
319                          if (lseek(hp->fd, hp->bi[i].fo, 0) < 0)
320                                  error(SYSTEM, "seek error on holodeck file");
321                          n *= sizeof(RAYVAL);
# Line 307 | Line 324 | int    nr;                     /* number of new rays desired */
324                                  "error reading beam from holodeck file");
325                  }
326          } else {                                /* just grow in memory */
327 <                hp->bl[i] = (BEAM *)realloc( (char *)hp->bl[i],
328 <                                hdbsiz(hp->bl[i]->nrm + nr) );
312 <                if (hp->bl[i] == NULL)
313 <                        goto memerr;
327 >                hp->bl[i] = (BEAM *)hdrealloc((char *)hp->bl[i],
328 >                                hdbsiz(hp->bl[i]->nrm + nr), "hdnewrays");
329                  blglob(hp)->nrm += nr;
330          }
331          p = hdbray(hp->bl[i]) + hp->bl[i]->nrm;
# Line 318 | Line 333 | int    nr;                     /* number of new rays desired */
333          bzero((char *)p, nr*sizeof(RAYVAL));
334          blglob(hp)->tick = hp->bl[i]->tick = hdclock++; /* update LRU clock */
335          return(p);                              /* point to new rays */
321 memerr:
322        error(SYSTEM, "out of memory in hdnewrays");
336   }
337  
338  
# Line 337 | Line 350 | register int   i;
350                          return(NULL);
351                  if (hdcachesize > 0 && hdmemuse(0) >= hdcachesize)
352                          hdfreecache(PCTFREE, NULL);     /* get free space */
353 <                errno = 0;
341 <                if ((hp->bl[i] = (BEAM *)malloc(hdbsiz(n))) == NULL)
342 <                        error(SYSTEM, "cannot allocate memory for beam");
353 >                hp->bl[i] = (BEAM *)hdrealloc(NULL, hdbsiz(n), "hdgetbeam");
354                  blglob(hp)->nrm += hp->bl[i]->nrm = n;
355 +                errno = 0;
356                  if (lseek(hp->fd, hp->bi[i].fo, 0) < 0)
357                          error(SYSTEM, "seek error on holodeck file");
358                  n *= sizeof(RAYVAL);
# Line 447 | Line 459 | register BEAMI *bi;
459                  f->nfrags--;
460   #endif
461          if (j % FRAGBLK == 0) {         /* more free list space */
462 +                register BEAMI  *newp;
463                  if (f->fi == NULL)
464 <                        f->fi = (BEAMI *)malloc(FRAGBLK*sizeof(BEAMI));
464 >                        newp = (BEAMI *)malloc((j+FRAGBLK)*sizeof(BEAMI));
465                  else
466 <                        f->fi = (BEAMI *)realloc((char *)f->fi,
466 >                        newp = (BEAMI *)realloc((char *)f->fi,
467                                          (j+FRAGBLK)*sizeof(BEAMI));
468 <                if (f->fi == NULL)
469 <                        error(SYSTEM, "out of memory in hdfreefrag");
468 >                if (newp == NULL) {
469 >                        f->nfrags--;    /* graceful failure */
470 >                        return;
471 >                }
472 >                f->fi = newp;
473          }
474          for ( ; ; j--) {                /* insert in descending list */
475                  if (!j || bi->fo < f->fi[j-1].fo) {
# Line 727 | Line 743 | register HOLO  *hp;            /* NULL means clean up all */
743                  return;
744          }
745                                          /* flush all data and free memory */
746 <        hdflush(hp);
746 >        hdfreebeam(hp, 0);
747 >        hdsync(hp, 0);
748                                          /* release fragment resources */
749          hdrelease(hp->fd);
750                                          /* remove hp from active list */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines