diff options
Diffstat (limited to 'src/mpfr-impl.h')
-rw-r--r-- | src/mpfr-impl.h | 90 |
1 files changed, 68 insertions, 22 deletions
diff --git a/src/mpfr-impl.h b/src/mpfr-impl.h index 096e6e2c1..1361759eb 100644 --- a/src/mpfr-impl.h +++ b/src/mpfr-impl.h @@ -23,11 +23,6 @@ http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., #ifndef __MPFR_IMPL_H__ #define __MPFR_IMPL_H__ -/* Include config.h before using ANY configure macros if needed. */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - /* Let's include some standard headers unconditionally as they are already needed by several source files or when some options are enabled/disabled, and it is easy to forget them (some configure @@ -69,6 +64,12 @@ http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., ****************** Include files ********************* ******************************************************/ +/* Include 'config.h' before using ANY configure macros if needed + NOTE: It isn't MPFR 'config.h', but GMP's one! */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + /* For the definition of MPFR_THREAD_ATTR. GCC/ICC detection macros are no longer used, as they sometimes gave incorrect information about the support of thread-local variables. A configure check is now done. */ @@ -204,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 |