diff options
| author | Antony Dovgal <tony2001@php.net> | 2007-02-20 12:00:58 +0000 |
|---|---|---|
| committer | Antony Dovgal <tony2001@php.net> | 2007-02-20 12:00:58 +0000 |
| commit | 8185f4550e365fc31da0a32e011ff4f918fd7e9b (patch) | |
| tree | b63413055683e4f64bd171f75b9ba0f9bdc486f8 /Zend/zend_strtod.c | |
| parent | 03e5b080a323976288cceff0f2051a7cffeda379 (diff) | |
| download | php-git-8185f4550e365fc31da0a32e011ff4f918fd7e9b.tar.gz | |
MFH: fix #40545 (multithreading issue in zend_strtod())
Diffstat (limited to 'Zend/zend_strtod.c')
| -rw-r--r-- | Zend/zend_strtod.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/Zend/zend_strtod.c b/Zend/zend_strtod.c index 3a80d9334c..90b922915d 100644 --- a/Zend/zend_strtod.c +++ b/Zend/zend_strtod.c @@ -410,7 +410,10 @@ struct Bigint { typedef struct Bigint Bigint; +/* static variables, multithreading fun! */ static Bigint *freelist[Kmax+1]; +static Bigint *p5s; + static void destroy_freelist(void); #ifdef ZTS @@ -754,28 +757,25 @@ static Bigint * s2b (CONST char *s, int nd0, int nd, ULong y9) return b; } - -static Bigint *p5s; - static Bigint * pow5mult(Bigint *b, int k) { Bigint *b1, *p5, *p51; int i; static int p05[3] = { 5, 25, 125 }; + _THREAD_PRIVATE_MUTEX_LOCK(pow5mult_mutex); if ((i = k & 3)) { b = multadd(b, p05[i-1], 0); } if (!(k >>= 2)) { + _THREAD_PRIVATE_MUTEX_UNLOCK(pow5mult_mutex); return b; } if (!(p5 = p5s)) { /* first time */ - _THREAD_PRIVATE_MUTEX_LOCK(pow5mult_mutex); p5 = p5s = i2b(625); p5->next = 0; - _THREAD_PRIVATE_MUTEX_UNLOCK(pow5mult_mutex); } for(;;) { if (k & 1) { @@ -787,15 +787,14 @@ static Bigint * pow5mult(Bigint *b, int k) break; } if (!(p51 = p5->next)) { - _THREAD_PRIVATE_MUTEX_LOCK(pow5mult_mutex); if (!(p51 = p5->next)) { p51 = p5->next = mult(p5,p5); p51->next = 0; } - _THREAD_PRIVATE_MUTEX_UNLOCK(pow5mult_mutex); } p5 = p51; } + _THREAD_PRIVATE_MUTEX_UNLOCK(pow5mult_mutex); return b; } |
