From 5075de70a69719bcf26668bb7a5979b9b261272a Mon Sep 17 00:00:00 2001 From: vlefevre Date: Thu, 10 Sep 2015 13:51:48 +0000 Subject: Applied changes from Stephan Tolksdorf: https://gforge.inria.fr/tracker/download.php/136/619/19537/4980/changes.zip The MPFR build fails on my Linux machine with CFLAGS=-Werror=missing-prototypes because MPFR_WIN_THREAD_SAFE_DLL gets defined (this CFLAGS just allowed me to detect the problem with MPFR_WIN_THREAD_SAFE_DLL, which could have otherwise remained unnoticed). git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/branches/win-thread-safe-dll@9680 280ebfd0-de03-0410-8827-d642c229c3f4 --- src/const_catalan.c | 8 ++++++ src/const_euler.c | 8 ++++++ src/const_log2.c | 10 +++++++ src/const_pi.c | 10 +++++++ src/exceptions.c | 6 ++++ src/mpfr-impl.h | 79 +++++++++++++++++++++++++++++++++++++++++------------ src/mpfr-thread.h | 8 +----- src/set_dfl_prec.c | 7 +++++ src/set_rnd.c | 8 ++++++ 9 files changed, 120 insertions(+), 24 deletions(-) diff --git a/src/const_catalan.c b/src/const_catalan.c index 0e4402d76..6cdd98c90 100644 --- a/src/const_catalan.c +++ b/src/const_catalan.c @@ -26,6 +26,14 @@ http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., /* Declare the cache */ MPFR_DECL_INIT_CACHE(__gmpfr_cache_const_catalan, mpfr_const_catalan_internal); +#ifdef MPFR_WIN_THREAD_SAFE_DLL +mpfr_cache_t * +__gmpfr_cache_const_catalan_f() +{ + return &__gmpfr_cache_const_catalan; +} +#endif + /* Set User Interface */ #undef mpfr_const_catalan int diff --git a/src/const_euler.c b/src/const_euler.c index 2db943865..0d94f58ab 100644 --- a/src/const_euler.c +++ b/src/const_euler.c @@ -29,6 +29,14 @@ http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., /* Declare the cache */ MPFR_DECL_INIT_CACHE(__gmpfr_cache_const_euler, mpfr_const_euler_internal); +#ifdef MPFR_WIN_THREAD_SAFE_DLL +mpfr_cache_t * +__gmpfr_cache_const_euler_f() +{ + return &__gmpfr_cache_const_euler; +} +#endif + /* Set User Interface */ #undef mpfr_const_euler int diff --git a/src/const_log2.c b/src/const_log2.c index 2d94bdb02..6255396b3 100644 --- a/src/const_log2.c +++ b/src/const_log2.c @@ -32,6 +32,16 @@ MPFR_DECL_INIT_CACHE(__gmpfr_logging_log2, mpfr_const_log2_internal); MPFR_THREAD_ATTR mpfr_cache_ptr __gmpfr_cache_const_log2 = __gmpfr_normal_log2; #endif +#ifdef MPFR_WIN_THREAD_SAFE_DLL +# ifndef MPFR_USE_LOGGING +mpfr_cache_t * __gmpfr_cache_const_log2_f() { return &__gmpfr_cache_const_log2; } +# else +mpfr_cache_t * __gmpfr_normal_log2_f() { return &__gmpfr_normal_log2; } +mpfr_cache_t * __gmpfr_logging_log2_f() { return &__gmpfr_logging_log2; } +mpfr_cache_ptr * __gmpfr_cache_const_log2_f() { return &__gmpfr_cache_const_log2; } +# endif +#endif + /* Set User interface */ #undef mpfr_const_log2 int diff --git a/src/const_pi.c b/src/const_pi.c index 6fd4d3834..cc96dc4a3 100644 --- a/src/const_pi.c +++ b/src/const_pi.c @@ -31,6 +31,16 @@ MPFR_DECL_INIT_CACHE(__gmpfr_logging_pi, mpfr_const_pi_internal); MPFR_THREAD_ATTR mpfr_cache_ptr __gmpfr_cache_const_pi = __gmpfr_normal_pi; #endif +#ifdef MPFR_WIN_THREAD_SAFE_DLL +# ifndef MPFR_USE_LOGGING +mpfr_cache_t * __gmpfr_cache_const_pi_f() { return &__gmpfr_cache_const_pi; } +# else +mpfr_cache_t * __gmpfr_normal_pi_f() { return &__gmpfr_normal_pi; } +mpfr_cache_t * __gmpfr_logging_pi_f() { return &__gmpfr_logging_pi; } +mpfr_cache_ptr * __gmpfr_cache_const_pi_f() { return &__gmpfr_cache_const_pi; } +# endif +#endif + /* Set User Interface */ #undef mpfr_const_pi int diff --git a/src/exceptions.c b/src/exceptions.c index 14b57e7e7..1ca3f062a 100644 --- a/src/exceptions.c +++ b/src/exceptions.c @@ -27,6 +27,12 @@ MPFR_THREAD_ATTR mpfr_flags_t __gmpfr_flags = 0; MPFR_THREAD_ATTR mpfr_exp_t __gmpfr_emin = MPFR_EMIN_DEFAULT; MPFR_THREAD_ATTR mpfr_exp_t __gmpfr_emax = MPFR_EMAX_DEFAULT; +#ifdef MPFR_WIN_THREAD_SAFE_DLL +mpfr_flags_t * __gmpfr_flags_f() { return &__gmpfr_flags; } +mpfr_exp_t * __gmpfr_emin_f() { return &__gmpfr_emin; } +mpfr_exp_t * __gmpfr_emax_f() { return &__gmpfr_emax; } +#endif + #undef mpfr_get_emin MPFR_COLD_FUNCTION_ATTR mpfr_exp_t diff --git a/src/mpfr-impl.h b/src/mpfr-impl.h index 97cd869b3..1361759eb 100644 --- a/src/mpfr-impl.h +++ b/src/mpfr-impl.h @@ -205,28 +205,73 @@ struct __gmpfr_cache_s { typedef struct __gmpfr_cache_s mpfr_cache_t[1]; typedef struct __gmpfr_cache_s *mpfr_cache_ptr; -__MPFR_DECLSPEC extern MPFR_THREAD_ATTR mpfr_flags_t __gmpfr_flags; -__MPFR_DECLSPEC extern MPFR_THREAD_ATTR mpfr_exp_t __gmpfr_emin; -__MPFR_DECLSPEC extern MPFR_THREAD_ATTR mpfr_exp_t __gmpfr_emax; -__MPFR_DECLSPEC extern MPFR_THREAD_ATTR mpfr_prec_t __gmpfr_default_fp_bit_precision; -__MPFR_DECLSPEC extern MPFR_THREAD_ATTR mpfr_rnd_t __gmpfr_default_rounding_mode; -__MPFR_DECLSPEC extern MPFR_THREAD_ATTR mpfr_cache_t __gmpfr_cache_const_euler; -__MPFR_DECLSPEC extern MPFR_THREAD_ATTR mpfr_cache_t __gmpfr_cache_const_catalan; +#if defined(MPFR_USE_THREAD_SAFE) && defined(__GMP_LIBGMP_DLL) +# define MPFR_WIN_THREAD_SAFE_DLL 1 +#endif -#ifndef MPFR_USE_LOGGING -__MPFR_DECLSPEC extern MPFR_THREAD_ATTR mpfr_cache_t __gmpfr_cache_const_pi; -__MPFR_DECLSPEC extern MPFR_THREAD_ATTR mpfr_cache_t __gmpfr_cache_const_log2; -#else +#if defined(__MPFR_WITHIN_MPFR) || !defined(MPFR_WIN_THREAD_SAFE_DLL) +extern MPFR_THREAD_ATTR mpfr_flags_t __gmpfr_flags; +extern MPFR_THREAD_ATTR mpfr_exp_t __gmpfr_emin; +extern MPFR_THREAD_ATTR mpfr_exp_t __gmpfr_emax; +extern MPFR_THREAD_ATTR mpfr_prec_t __gmpfr_default_fp_bit_precision; +extern MPFR_THREAD_ATTR mpfr_rnd_t __gmpfr_default_rounding_mode; +extern MPFR_THREAD_ATTR mpfr_cache_t __gmpfr_cache_const_euler; +extern MPFR_THREAD_ATTR mpfr_cache_t __gmpfr_cache_const_catalan; +# ifndef MPFR_USE_LOGGING +extern MPFR_THREAD_ATTR mpfr_cache_t __gmpfr_cache_const_pi; +extern MPFR_THREAD_ATTR mpfr_cache_t __gmpfr_cache_const_log2; +# else /* Two constants are used by the logging functions (via mpfr_fprintf, then mpfr_log, for the base conversion): pi and log(2). Since the mpfr_cache function isn't re-entrant when working on the same cache, we need to define two caches for each constant. */ -__MPFR_DECLSPEC extern MPFR_THREAD_ATTR mpfr_cache_t __gmpfr_normal_pi; -__MPFR_DECLSPEC extern MPFR_THREAD_ATTR mpfr_cache_t __gmpfr_normal_log2; -__MPFR_DECLSPEC extern MPFR_THREAD_ATTR mpfr_cache_t __gmpfr_logging_pi; -__MPFR_DECLSPEC extern MPFR_THREAD_ATTR mpfr_cache_t __gmpfr_logging_log2; -__MPFR_DECLSPEC extern MPFR_THREAD_ATTR mpfr_cache_ptr __gmpfr_cache_const_pi; -__MPFR_DECLSPEC extern MPFR_THREAD_ATTR mpfr_cache_ptr __gmpfr_cache_const_log2; +extern MPFR_THREAD_ATTR mpfr_cache_t __gmpfr_normal_pi; +extern MPFR_THREAD_ATTR mpfr_cache_t __gmpfr_normal_log2; +extern MPFR_THREAD_ATTR mpfr_cache_t __gmpfr_logging_pi; +extern MPFR_THREAD_ATTR mpfr_cache_t __gmpfr_logging_log2; +extern MPFR_THREAD_ATTR mpfr_cache_ptr __gmpfr_cache_const_pi; +extern MPFR_THREAD_ATTR mpfr_cache_ptr __gmpfr_cache_const_log2; +# endif +#endif + +#ifdef MPFR_WIN_THREAD_SAFE_DLL +__MPFR_DECLSPEC mpfr_flags_t * __gmpfr_flags_f(); +__MPFR_DECLSPEC mpfr_exp_t * __gmpfr_emin_f(); +__MPFR_DECLSPEC mpfr_exp_t * __gmpfr_emax_f(); +__MPFR_DECLSPEC mpfr_prec_t * __gmpfr_default_fp_bit_precision_f(); +__MPFR_DECLSPEC mpfr_rnd_t * __gmpfr_default_rounding_mode_f(); +__MPFR_DECLSPEC mpfr_cache_t * __gmpfr_cache_const_euler_f(); +__MPFR_DECLSPEC mpfr_cache_t * __gmpfr_cache_const_catalan_f(); +# ifndef MPFR_USE_LOGGING +__MPFR_DECLSPEC mpfr_cache_t * __gmpfr_cache_const_pi_f(); +__MPFR_DECLSPEC mpfr_cache_t * __gmpfr_cache_const_log2_f(); +# else +__MPFR_DECLSPEC mpfr_cache_t * __gmpfr_normal_pi_f(); +__MPFR_DECLSPEC mpfr_cache_t * __gmpfr_normal_log2_f(); +__MPFR_DECLSPEC mpfr_cache_t * __gmpfr_logging_pi_f(); +__MPFR_DECLSPEC mpfr_cache_t * __gmpfr_logging_log2_f(); +__MPFR_DECLSPEC mpfr_cache_ptr * __gmpfr_cache_const_pi_f(); +__MPFR_DECLSPEC mpfr_cache_ptr * __gmpfr_cache_const_log2_f(); +# endif +# ifndef __MPFR_WITHIN_MPFR +# define __gmpfr_flags (*__gmpfr_flags_f()) +# define __gmpfr_emin (*__gmpfr_emin_f()) +# define __gmpfr_emax (*__gmpfr_emax_f()) +# define __gmpfr_default_fp_bit_precision (*__gmpfr_default_fp_bit_precision_f()) +# define __gmpfr_default_rounding_mode (*__gmpfr_default_rounding_mode_f()) +# define __gmpfr_cache_const_euler (*__gmpfr_cache_const_euler_f()) +# define __gmpfr_cache_const_catalan (*__gmpfr_cache_const_catalan_f()) +# ifndef MPFR_USE_LOGGING +# define __gmpfr_cache_const_pi (*__gmpfr_cache_const_pi_f()) +# define __gmpfr_cache_const_log2 (*__gmpfr_cache_const_log2_f()) +# else +# define __gmpfr_normal_pi (*__gmpfr_normal_pi_f()) +# define __gmpfr_logging_pi (*__gmpfr_logging_pi_f()) +# define __gmpfr_logging_log2 (*__gmpfr_logging_log2_f()) +# define __gmpfr_cache_const_pi (*__gmpfr_cache_const_pi_f()) +# define __gmpfr_cache_const_log2 (*__gmpfr_cache_const_log2_f()) +# endif +# endif #endif #define BASE_MAX 62 diff --git a/src/mpfr-thread.h b/src/mpfr-thread.h index c3d7d2bf8..fb69c826f 100644 --- a/src/mpfr-thread.h +++ b/src/mpfr-thread.h @@ -31,13 +31,7 @@ http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., #ifndef MPFR_THREAD_ATTR # ifdef MPFR_USE_THREAD_SAFE # if defined(_MSC_VER) -# if defined(_WINDLL) -/* see http://msdn.microsoft.com/en-us/library/9w1sdazb%28v=vs.80%29.aspx */ -# error "Can't build MPFR DLL as thread safe." -# define MPFR_THREAD_ATTR -# else -# define MPFR_THREAD_ATTR __declspec( thread ) -# endif +# define MPFR_THREAD_ATTR __declspec( thread ) # elif defined(MPFR_USE_C11_THREAD_SAFE) # define MPFR_THREAD_ATTR _Thread_local # else diff --git a/src/set_dfl_prec.c b/src/set_dfl_prec.c index 537eb37ba..b9a720651 100644 --- a/src/set_dfl_prec.c +++ b/src/set_dfl_prec.c @@ -26,6 +26,13 @@ http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., MPFR_THREAD_ATTR mpfr_prec_t __gmpfr_default_fp_bit_precision \ = IEEE_DBL_MANT_DIG; +#ifdef MPFR_WIN_THREAD_SAFE_DLL +mpfr_prec_t * __gmpfr_default_fp_bit_precision_f() +{ + return &__gmpfr_default_fp_bit_precision; +} +#endif + void mpfr_set_default_prec (mpfr_prec_t prec) { diff --git a/src/set_rnd.c b/src/set_rnd.c index 1a2cfc065..0c8455cf7 100644 --- a/src/set_rnd.c +++ b/src/set_rnd.c @@ -25,6 +25,14 @@ http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., MPFR_THREAD_ATTR mpfr_rnd_t __gmpfr_default_rounding_mode = MPFR_RNDN; +#ifdef MPFR_WIN_THREAD_SAFE_DLL +mpfr_rnd_t * +__gmpfr_default_rounding_mode_f() +{ + return &__gmpfr_default_rounding_mode; +} +#endif + void mpfr_set_default_rounding_mode (mpfr_rnd_t rnd_mode) { -- cgit v1.2.1