summaryrefslogtreecommitdiff
path: root/src/mpfr-impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mpfr-impl.h')
-rw-r--r--src/mpfr-impl.h90
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