From: Oliver Kurth Date: Fri, 15 Sep 2017 18:22:43 +0000 (-0700) Subject: Revise dtoa() to use ecvt_r/fcvt_r on Linux/ESX an thus avoid using a X-Git-Tag: stable-10.2.0~709 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1c6c46cbbde90641cf576232aa057c5143eb9bd2;p=thirdparty%2Fopen-vm-tools.git Revise dtoa() to use ecvt_r/fcvt_r on Linux/ESX an thus avoid using a pthread_mutex_lock. --- diff --git a/open-vm-tools/lib/string/bsd_output_shared.c b/open-vm-tools/lib/string/bsd_output_shared.c index dd2ee150d..b56ac082e 100644 --- a/open-vm-tools/lib/string/bsd_output_shared.c +++ b/open-vm-tools/lib/string/bsd_output_shared.c @@ -49,9 +49,13 @@ #include #include #include -#ifndef _WIN32 +#ifdef __APPLE__ #include #endif +#if !defined(_WIN32) || !defined(__APPLE__) +/* required to handle %.20f conversion of 1e308 */ +#define FP_BUFFERSIZE 349 +#endif #include "vmware.h" #include "bsd_output_int.h" @@ -98,7 +102,7 @@ dtoa(double d, // IN int *sign, // OUT char **strEnd) // OUT { - char *str = NULL; + char *str; int dec; #if defined(_WIN32) @@ -137,10 +141,10 @@ dtoa(double d, // IN */ if (str && *str == '\0' && dec < 0 && dec < -prec) { - dec = -prec; + dec = -prec; } } -#else // _WIN32 +#elif __APPLE__ static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; if (2 == mode) { @@ -150,7 +154,6 @@ dtoa(double d, // IN } else { ASSERT(3 == mode); -#ifdef __APPLE__ /* * The Mac fcvt() returns "" when prec is 0, so we have to * compensate. See bug 233530. @@ -165,25 +168,36 @@ dtoa(double d, // IN */ if (prec == 0) { - size_t l; + size_t l; pthread_mutex_lock(&mutex); - str = strdup(fcvt(round(d), 1, &dec, sign)); + str = strdup(fcvt(round(d), 1, &dec, sign)); pthread_mutex_unlock(&mutex); - if (str) { - l = strlen(str); - ASSERT(l > 0); - l--; - ASSERT(str[l] == '0'); - str[l] = '\0'; + if (str) { + l = strlen(str); + ASSERT(l > 0); + l--; + ASSERT(str[l] == '0'); + str[l] = '\0'; } - } else -#endif // __APPLE__ - { + } else { pthread_mutex_lock(&mutex); str = strdup(fcvt(d, prec, &dec, sign)); pthread_mutex_unlock(&mutex); } } +#else + if (2 == mode) { + char buf[FP_BUFFERSIZE]; + + str = + ecvt_r(d, prec, &dec, sign, buf, sizeof buf) != 0 ? NULL : strdup(buf); + } else { + char buf[FP_BUFFERSIZE]; + + ASSERT(3 == mode); + str = + fcvt_r(d, prec, &dec, sign, buf, sizeof buf) != 0 ? NULL : strdup(buf); + } #endif // _WIN32 if (str) {