]>
Commit | Line | Data |
---|---|---|
51282358 A |
1 | --- gdtoa-misc.c.orig 2010-01-07 22:03:21.000000000 -0800 |
2 | +++ gdtoa-misc.c 2010-01-07 22:25:33.000000000 -0800 | |
34e8f829 A |
3 | @@ -29,9 +29,20 @@ THIS SOFTWARE. |
4 | /* Please send bug reports to David M. Gay (dmg at acm dot org, | |
5 | * with " at " changed at "@" and " dot " changed to "."). */ | |
6 | ||
7 | +#define GDTOA_TSD | |
8 | +#define Omit_Private_Memory | |
9 | + | |
10 | +#ifdef GDTOA_TSD | |
11 | +#include <pthread.h> | |
12 | +#endif /* GDTOA_TSD */ | |
13 | #include "gdtoaimp.h" | |
14 | ||
15 | +#ifdef GDTOA_TSD | |
16 | +static pthread_key_t gdtoa_tsd_key = (pthread_key_t)-1; | |
17 | +static pthread_mutex_t gdtoa_tsd_lock = PTHREAD_MUTEX_INITIALIZER; | |
18 | +#else /* !GDTOA_TSD */ | |
19 | static Bigint *freelist[Kmax+1]; | |
20 | +#endif /* GDTOA_TSD */ | |
21 | #ifndef Omit_Private_Memory | |
22 | #ifndef PRIVATE_MEM | |
23 | #define PRIVATE_MEM 2304 | |
24 | @@ -40,6 +51,26 @@ THIS SOFTWARE. | |
25 | static double private_mem[PRIVATE_mem], *pmem_next = private_mem; | |
26 | #endif | |
27 | ||
28 | +#ifdef GDTOA_TSD | |
29 | +static void | |
30 | +gdtoa_freelist_free(void *x) | |
31 | +{ | |
32 | + int i; | |
33 | + Bigint *cur, *next; | |
34 | + Bigint **fl = (Bigint **)x; | |
35 | + | |
36 | + if (!fl) return; | |
37 | + for(i = 0; i < Kmax+1; fl++, i++) { | |
38 | + if (!*fl) continue; | |
39 | + for(cur = *fl; cur; cur = next) { | |
40 | + next = cur->next; | |
41 | + free(cur); | |
42 | + } | |
43 | + } | |
44 | + free(x); | |
45 | + } | |
46 | +#endif /* GDTOA_TSD */ | |
47 | + | |
48 | Bigint * | |
49 | Balloc | |
50 | #ifdef KR_headers | |
51282358 | 51 | @@ -53,9 +84,26 @@ Balloc |
34e8f829 A |
52 | #ifndef Omit_Private_Memory |
53 | unsigned int len; | |
54 | #endif | |
55 | +#ifdef GDTOA_TSD | |
56 | + Bigint **freelist; | |
57 | ||
58 | + if (gdtoa_tsd_key == (pthread_key_t)-1) { | |
59 | + pthread_mutex_lock(&gdtoa_tsd_lock); | |
60 | + if (gdtoa_tsd_key == (pthread_key_t)-1) { | |
61 | + gdtoa_tsd_key = __LIBC_PTHREAD_KEY_GDTOA_BIGINT; | |
62 | + pthread_key_init_np(gdtoa_tsd_key, gdtoa_freelist_free); | |
63 | + } | |
64 | + pthread_mutex_unlock(&gdtoa_tsd_lock); | |
65 | + } | |
66 | + if ((freelist = (Bigint **)pthread_getspecific(gdtoa_tsd_key)) == NULL) { | |
67 | + freelist = (Bigint **)MALLOC((Kmax+1) * sizeof(Bigint *)); | |
68 | + bzero(freelist, (Kmax+1) * sizeof(Bigint *)); | |
69 | + pthread_setspecific(gdtoa_tsd_key, freelist); | |
70 | + } | |
71 | +#else /* !GDTOA_TSD */ | |
72 | ACQUIRE_DTOA_LOCK(0); | |
51282358 | 73 | - if ( (rv = freelist[k]) !=0) { |
34e8f829 | 74 | +#endif /* GDTOA_TSD */ |
51282358 | 75 | + if (k <= Kmax && (rv = freelist[k]) !=0) { |
34e8f829 A |
76 | freelist[k] = rv->next; |
77 | } | |
51282358 A |
78 | else { |
79 | @@ -65,7 +113,7 @@ Balloc | |
80 | #else | |
81 | len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1) | |
82 | /sizeof(double); | |
83 | - if (pmem_next - private_mem + len <= PRIVATE_mem) { | |
84 | + if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) { | |
85 | rv = (Bigint*)pmem_next; | |
86 | pmem_next += len; | |
87 | } | |
34e8f829 A |
88 | @@ -75,7 +123,9 @@ Balloc |
89 | rv->k = k; | |
90 | rv->maxwds = x; | |
91 | } | |
92 | +#ifndef GDTOA_TSD | |
93 | FREE_DTOA_LOCK(0); | |
94 | +#endif /* GDTOA_TSD */ | |
95 | rv->sign = rv->wds = 0; | |
96 | return rv; | |
97 | } | |
51282358 | 98 | @@ -89,10 +139,20 @@ Bfree |
34e8f829 A |
99 | #endif |
100 | { | |
101 | if (v) { | |
51282358 A |
102 | - ACQUIRE_DTOA_LOCK(0); |
103 | - v->next = freelist[v->k]; | |
104 | - freelist[v->k] = v; | |
105 | - FREE_DTOA_LOCK(0); | |
106 | + if (v->k > Kmax) | |
107 | + free((void*)v); | |
108 | + else { | |
34e8f829 | 109 | +#ifdef GDTOA_TSD |
51282358 | 110 | + Bigint **freelist = (Bigint **)pthread_getspecific(gdtoa_tsd_key); |
34e8f829 | 111 | +#else /* !GDTOA_TSD */ |
51282358 | 112 | + ACQUIRE_DTOA_LOCK(0); |
34e8f829 | 113 | +#endif /* GDTOA_TSD */ |
51282358 A |
114 | + v->next = freelist[v->k]; |
115 | + freelist[v->k] = v; | |
34e8f829 | 116 | +#ifndef GDTOA_TSD |
51282358 | 117 | + FREE_DTOA_LOCK(0); |
34e8f829 | 118 | +#endif /* GDTOA_TSD */ |
51282358 | 119 | + } |
34e8f829 A |
120 | } |
121 | } | |
122 |