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

Comparing ray/src/common/malloc.c (file contents):
Revision 2.7 by greg, Fri Sep 4 18:36:05 1992 UTC vs.
Revision 2.14 by greg, Wed Apr 23 00:52:33 2003 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1992 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   * Fast malloc for memory hogs and VM environments.
6   * Performs a minimum of searching through free lists.
# Line 22 | Line 19 | static char SCCSid[] = "$SunId$ LBL";
19   *      Greg Ward       Lawrence Berkeley Laboratory
20   */
21  
22 + #include "copyright.h"
23 +
24   #include  <errno.h>
25  
27 extern int      errno;
28
26   #ifndef  BSD
27   #define  bcopy(s,d,n)           (void)memcpy(d,s,n)
28   #define  bzero(d,n)             (void)memset(d,0,n)
32 extern char  *memcpy(), *memset();
29   #endif
30  
31   #ifdef MSTATS
# Line 46 | Line 42 | static unsigned        m_nwasted = 0;
42   #define  NULL           0
43   #endif
44  
45 < #ifndef ALIGN
46 < #define  ALIGN          int                     /* align type */
45 > #ifndef ALIGNT
46 > #define  ALIGNT         int                     /* align type */
47   #endif
48 < #define  BYTES_WORD     sizeof(ALIGN)
48 > #define  BYTES_WORD     sizeof(ALIGNT)
49  
50   #ifndef  MAXINCR
51   #define  MAXINCR        (1<<16)                 /* largest sbrk(2) increment */
# Line 61 | Line 57 | typedef union m_head {
57                  short           magic;
58                  short           bucket;
59          }       a;
60 <        ALIGN           dummy;
60 >        ALIGNT          dummy;
61   } M_HEAD;
62  
63   #define MAGIC           0x1a2           /* magic number for allocated memory */
# Line 71 | Line 67 | typedef union m_head {
67  
68   static M_HEAD   *free_list[NBUCKETS];
69  
70 < static ALIGN    dummy_mem;
70 > static ALIGNT   dummy_mem;
71  
72   static char     *memlim[2];
73  
# Line 162 | Line 158 | unsigned       *np;
158  
159          for ( ; ; ) {
160                                          /* compact free lists */
161 <                compactfree();
161 >                while (compactfree())
162 >                        ;
163                                          /* find largest block */
164                  tab = mtab(&cptab); tablen = mtablen(&cptab);
165                  big = tab;
# Line 253 | Line 250 | register unsigned  n;
250          n = (n+(BYTES_WORD-1))&~(BYTES_WORD-1);         /* word align rqst. */
251  
252          if (n > nrem) {                                 /* need more core */
253 +        tryagain:
254                  if (n > amnt) {                         /* big chunk */
255                          thisamnt = (n+(pagesz-1))&~(pagesz-1);
256                          if (thisamnt <= MAXINCR)        /* increase amnt */
# Line 261 | Line 259 | register unsigned  n;
259                          thisamnt = amnt;
260                  p = sbrk(thisamnt);
261                  if ((int)p == -1) {                     /* uh-oh, ENOMEM */
262 <                        thisamnt = n;                   /* search free lists */
263 <                        p = mscrounge(&thisamnt);
264 <                        if (p == NULL)                  /* we're really out */
262 >                        errno = 0;                      /* call cavalry */
263 >                        if (thisamnt >= n+pagesz) {
264 >                                amnt = pagesz;          /* minimize request */
265 >                                goto tryagain;
266 >                        }
267 >                        thisamnt = n;
268 >                        p = mscrounge(&thisamnt);       /* search free lists */
269 >                        if (p == NULL) {                /* we're really out */
270 >                                errno = ENOMEM;
271                                  return(NULL);
272 +                        }
273                  }
274   #ifdef MSTATS
275                  else b_nsbrked += thisamnt;
# Line 297 | Line 302 | register unsigned  n;
302          register int    bucket;
303          register unsigned       bsiz;
304  
305 <        if (n < 1<<FIRSTBUCKET)
305 >        if (n < 1<<FIRSTBUCKET || p == NULL)
306                  return;
307   #ifdef MSTATS
308          b_nfreed += n;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines