summaryrefslogtreecommitdiff
path: root/Zend/zend_strtod.c
diff options
context:
space:
mode:
authorAntony Dovgal <tony2001@php.net>2007-02-20 12:00:58 +0000
committerAntony Dovgal <tony2001@php.net>2007-02-20 12:00:58 +0000
commit8185f4550e365fc31da0a32e011ff4f918fd7e9b (patch)
treeb63413055683e4f64bd171f75b9ba0f9bdc486f8 /Zend/zend_strtod.c
parent03e5b080a323976288cceff0f2051a7cffeda379 (diff)
downloadphp-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.c13
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;
}