ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/bmalloc.c
Revision: 2.9
Committed: Sat Oct 23 18:55:52 2004 UTC (19 years, 5 months ago) by schorsch
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, rad5R2, rad4R2P2, rad5R0, rad5R1, rad3R7P2, rad3R7P1, rad4R2, rad4R1, rad4R0, rad3R6P1, rad3R8, rad3R9, rad4R2P1, rad5R3, HEAD
Changes since 2.8: +3 -2 lines
Log Message:
Compatibility fixes as suggested by Siegbert Debatin.

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: bmalloc.c,v 2.8 2004/10/03 20:48:53 schorsch 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 size_t nremain = 0;
31
32
33 void *
34 bmalloc( /* allocate a block of n bytes */
35 register size_t n
36 )
37 {
38 if (n > nremain && (n > MBLKSIZ || nremain > MBLKSIZ/WASTEFRAC))
39 return(malloc(n)); /* too big */
40
41 n = (n+(BYTES_WORD-1))&~(BYTES_WORD-1); /* word align */
42
43 if (n > nremain && (bposition = malloc(nremain = MBLKSIZ)) == NULL) {
44 nremain = 0;
45 return(NULL);
46 }
47 bposition += n;
48 nremain -= n;
49 return(bposition - n);
50 }
51
52
53 void
54 bfree( /* free random memory */
55 register void *pp,
56 register size_t n
57 )
58 {
59 register char *p = pp;
60 register size_t bsiz;
61 /* check alignment */
62 bsiz = BYTES_WORD - ((size_t)p&(BYTES_WORD-1));
63 if (bsiz < BYTES_WORD) {
64 p += bsiz;
65 n -= bsiz;
66 }
67 if (p + n == bposition) { /* just allocated? */
68 bposition = p;
69 nremain += n;
70 return;
71 }
72 if (n > nremain) { /* better than what we've got? */
73 bposition = p;
74 nremain = n;
75 return;
76 }
77 /* just throw it away, then */
78 }