From: Antony Dovgal Date: Tue, 20 Feb 2007 12:00:58 +0000 (+0000) Subject: MFH: fix #40545 (multithreading issue in zend_strtod()) X-Git-Tag: php-5.2.2RC1~355 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8185f4550e365fc31da0a32e011ff4f918fd7e9b;p=php MFH: fix #40545 (multithreading issue in zend_strtod()) --- 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; }