summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2015-09-10 13:40:33 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2015-09-10 13:40:33 +0000
commit268df0f5f40896539ef9436df17191ff184a489d (patch)
treee1fdb117a6ce8fd66a2631b2b39ddfe0c2a3f16e
parente9943bfe3f352c6c199c40ca4c2df3a654a4e276 (diff)
downloadmpfr-268df0f5f40896539ef9436df17191ff184a489d.tar.gz
Applied changes from Stephan Tolksdorf:
https://gforge.inria.fr/tracker/download.php/136/619/19537/4980/changes.zip (with some tests, the MPFR build fails on my Linux machine because MPFR_WIN_THREAD_SAFE_DLL gets defined). git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/branches/win-thread-safe-dll@9677 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r--src/const_catalan.c8
-rw-r--r--src/const_euler.c8
-rw-r--r--src/const_log2.c10
-rw-r--r--src/const_pi.c10
-rw-r--r--src/exceptions.c6
-rw-r--r--src/mpfr-impl.h90
-rw-r--r--src/mpfr-thread.h8
-rw-r--r--src/set_dfl_prec.c7
-rw-r--r--src/set_rnd.c8
9 files changed, 126 insertions, 29 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 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
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)
{