Bug 516862: Backported a change from dtoa.c upstream made on 2009-03-01. [p=reed r=crowder r=mrbkap a=dveditz]

Here is an excerpt from the 'changes' file describing this change:
"dtoa.c and gdtoa/gdtoaimp.h and gdtoa/misc.c: reduce Kmax, and use
MALLOC and FREE or free for huge blocks, which are possible only in
pathological cases, such as dtoa calls in mode 3 with thousands of
digits requested, or strtod() calls with thousand of digits. For the
latter case, I have an alternate approach that runs much faster
and uses less memory, but finding time to get it ready for distribution
may take a while."


git-svn-id: svn://10.0.0.236/trunk@258450 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
reed%reedloden.com 2009-09-22 06:16:27 +00:00
parent 61251b565d
commit b7efdceee7

View File

@ -151,7 +151,12 @@
* #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
* if memory is available and otherwise does something you deem
* appropriate. If MALLOC is undefined, malloc will be invoked
* directly -- and assumed always to succeed.
* directly -- and assumed always to succeed. Similarly, if you
* want something other than the system's free() to be called to
* recycle memory acquired from MALLOC, #define FREE to be the
* name of the alternate routine. (FREE or free is only called in
* pathological cases, e.g., in a dtoa call after a dtoa return in
* mode 3 with thousands of digits requested.)
* #define Omit_Private_Memory to omit logic (added Jan. 1998) for making
* memory allocations from a private pool of memory when possible.
* When used, the private pool is PRIVATE_MEM bytes long: 2000 bytes,
@ -326,7 +331,7 @@ static PRLock *freelist_lock;
#define RELEASE_DTOA_LOCK() /*nothing*/
#endif
#define Kmax 15
#define Kmax 7
struct Bigint {
struct Bigint *next; /* Free list link */
@ -406,7 +411,7 @@ static Bigint *Balloc(int32 k)
}
#endif
if ((rv = freelist[k]) != NULL)
if (k <= Kmax && (rv = freelist[k]) != NULL)
freelist[k] = rv->next;
if (rv == NULL) {
x = 1 << k;
@ -415,7 +420,7 @@ static Bigint *Balloc(int32 k)
#else
len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
/sizeof(double);
if (pmem_next - private_mem + len <= PRIVATE_mem) {
if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) {
rv = (Bigint*)pmem_next;
pmem_next += len;
}
@ -434,8 +439,16 @@ static Bigint *Balloc(int32 k)
static void Bfree(Bigint *v)
{
if (v) {
v->next = freelist[v->k];
freelist[v->k] = v;
if (v->k > Kmax)
#ifdef FREE
FREE((void*)v);
#else
free((void*)v);
#endif
else {
v->next = freelist[v->k];
freelist[v->k] = v;
}
}
}