ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/bmalloc.c
Revision: 2.5
Committed: Thu Jul 17 09:21:29 2003 UTC (20 years, 9 months ago) by schorsch
Content type: text/plain
Branch: MAIN
Changes since 2.4: +3 -1 lines
Log Message:
Added prototypes and includes from patch by Randolph Fritz.
Added more required includes and reduced other compile warnings.

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: bmalloc.c,v 2.4 2003/02/25 02:47:21 greg Exp $";
3 #endif
4 /*
5 * Bmalloc provides basic memory allocation without overhead (no free lists).
6 * Use only to take the load off of malloc for all those
7 * piddling little requests that you never expect to free.
8 * Bmalloc defers to malloc for big requests.
9 * Bfree should hand memory to bmalloc, but it usually fails here.
10 *
11 * External symbols declared in standard.h
12 */
13
14 #include "copyright.h"
15
16 #include <stdlib.h>
17
18 #include "rtmisc.h"
19
20 #ifndef MBLKSIZ
21 #define MBLKSIZ 16376 /* size of memory allocation block */
22 #endif
23 #define WASTEFRAC 12 /* don't waste more than a fraction */
24 #ifndef ALIGNT
25 #define ALIGNT double /* type for alignment */
26 #endif
27 #define BYTES_WORD sizeof(ALIGNT)
28
29 static char *bposition = NULL;
30 static unsigned int nremain = 0;
31
32
33 char *
34 bmalloc(n) /* allocate a block of n bytes */
35 register unsigned int n;
36 {
37 if (n > nremain && (n > MBLKSIZ || nremain > MBLKSIZ/WASTEFRAC))
38 return(malloc(n)); /* too big */
39
40 n = (n+(BYTES_WORD-1))&~(BYTES_WORD-1); /* word align */
41
42 if (n > nremain && (bposition = (char *)malloc(nremain = MBLKSIZ)) == NULL) {
43 nremain = 0;
44 return(NULL);
45 }
46 bposition += n;
47 nremain -= n;
48 return(bposition - n);
49 }
50
51
52 void
53 bfree(p, n) /* free random memory */
54 register char *p;
55 register unsigned int n;
56 {
57 register unsigned int bsiz;
58 /* check alignment */
59 bsiz = BYTES_WORD - ((unsigned int)p&(BYTES_WORD-1));
60 if (bsiz < BYTES_WORD) {
61 p += bsiz;
62 n -= bsiz;
63 }
64 if (p + n == bposition) { /* just allocated? */
65 bposition = p;
66 nremain += n;
67 return;
68 }
69 if (n > nremain) { /* better than what we've got? */
70 bposition = p;
71 nremain = n;
72 return;
73 }
74 /* just throw it away, then */
75 }