diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mpfr-impl.h | 4 | ||||
-rw-r--r-- | src/mpfr-thread.h | 81 |
2 files changed, 29 insertions, 56 deletions
diff --git a/src/mpfr-impl.h b/src/mpfr-impl.h index d2843ab68..805e3cb4a 100644 --- a/src/mpfr-impl.h +++ b/src/mpfr-impl.h @@ -213,6 +213,10 @@ extern "C" { # define MPFR_CACHE_ATTR MPFR_THREAD_ATTR #endif +/* Note: The following structure and types depend on the MPFR build options + (including compiler options), due to the various locking methods affecting + MPFR_DEFERRED_INIT_SLAVE_DECL and MPFR_LOCK_DECL. But since this is only + internal, that's OK. */ struct __gmpfr_cache_s { mpfr_t x; int inexact; diff --git a/src/mpfr-thread.h b/src/mpfr-thread.h index ed04d9bcf..6ae66745a 100644 --- a/src/mpfr-thread.h +++ b/src/mpfr-thread.h @@ -64,38 +64,21 @@ https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., #define MPFR_LOCK_DECL(_lock) \ mtx_t _lock; -#define MPFR_LOCK_INIT(_lock) do { \ - int error_code = mtx_init(&(_lock), mtx_plain); \ - MPFR_ASSERTD( error_code == thrd_success); \ +#define MPFR_LOCK_C(E) \ + do { \ + if ((E) != thrd_success) \ + abort (); \ } while (0) -#define MPFR_LOCK_CLEAR(_lock) do { \ - mtx_destroy(&(_lock)); \ - } while (0) - -#define MPFR_LOCK_READ(_lock) do { \ - int error_code = mtx_lock(&(_lock)); \ - MPFR_ASSERTD(error_code == thrd_success); \ - } while (0) - -#define MPFR_UNLOCK_READ(_lock) do { \ - int error_code = mtx_unlock(&(_lock)); \ - MPFR_ASSERTD(error_code == thrd_success); \ - } while (0) +#define MPFR_LOCK_INIT(_lock) MPFR_LOCK_C(mtx_init(&(_lock), mtx_plain)) +#define MPFR_LOCK_CLEAR(_lock) do { mtx_destroy(&(_lock)); } while (0) +#define MPFR_LOCK_READ(_lock) MPFR_LOCK_C(mtx_lock(&(_lock))) +#define MPFR_UNLOCK_READ(_lock) MPFR_LOCK_C(mtx_unlock(&(_lock))) +#define MPFR_LOCK_WRITE(_lock) MPFR_LOCK_C(mtx_lock(&(_lock))) +#define MPFR_UNLOCK_WRITE(_lock) MPFR_LOCK_C(mtx_unlock(&(_lock))) -#define MPFR_LOCK_WRITE(_lock) do { \ - int error_code = mtx_lock(&(_lock)); \ - MPFR_ASSERTD(error_code == thrd_success); \ - } while (0) - -#define MPFR_UNLOCK_WRITE(_lock) do { \ - int error_code = mtx_unlock(&(_lock)); \ - MPFR_ASSERTD(error_code == thrd_success); \ - } while (0) - -#define MPFR_LOCK_READ2WRITE(_lock) - -#define MPFR_LOCK_WRITE2READ(_lock) +#define MPFR_LOCK_READ2WRITE(_lock) do {} while (0) +#define MPFR_LOCK_WRITE2READ(_lock) do {} while (0) #define MPFR_ONCE_DECL(_once) \ once_flag _once; @@ -121,37 +104,25 @@ https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., #include <pthread.h> -#define MPFR_LOCK_DECL(_lock) \ +#define MPFR_LOCK_DECL(_lock) \ pthread_rwlock_t _lock; -#define MPFR_LOCK_INIT(_lock) do { \ - int error_code = pthread_rwlock_init(&(_lock), NULL); \ - MPFR_ASSERTD( error_code == 0); \ +#define MPFR_LOCK_C(E) \ + do { \ + if ((E) != 0) \ + abort (); \ } while (0) +#define MPFR_LOCK_INIT(_lock) MPFR_LOCK_C(pthread_rwlock_init(&(_lock), NULL)) + #define MPFR_LOCK_CLEAR(_lock) do { \ pthread_rwlock_destroy(&(_lock)); \ } while (0) -#define MPFR_LOCK_READ(_lock) do { \ - int error_code = pthread_rwlock_rdlock(&(_lock)); \ - MPFR_ASSERTD(error_code == 0); \ - } while (0) - -#define MPFR_UNLOCK_READ(_lock) do { \ - int error_code = pthread_rwlock_unlock(&(_lock)); \ - MPFR_ASSERTD(error_code == 0); \ - } while (0) - -#define MPFR_LOCK_WRITE(_lock) do { \ - int error_code = pthread_rwlock_wrlock(&(_lock)); \ - MPFR_ASSERTD(error_code == 0); \ - } while (0) - -#define MPFR_UNLOCK_WRITE(_lock) do { \ - int error_code = pthread_rwlock_unlock(&(_lock)); \ - MPFR_ASSERTD(error_code == 0); \ - } while (0) +#define MPFR_LOCK_READ(_lock) MPFR_LOCK_C(pthread_rwlock_rdlock(&(_lock))) +#define MPFR_UNLOCK_READ(_lock) MPFR_LOCK_C(pthread_rwlock_unlock(&(_lock))) +#define MPFR_LOCK_WRITE(_lock) MPFR_LOCK_C(pthread_rwlock_wrlock(&(_lock))) +#define MPFR_UNLOCK_WRITE(_lock) MPFR_LOCK_C(pthread_rwlock_unlock(&(_lock))) #define MPFR_LOCK_READ2WRITE(_lock) do { \ MPFR_UNLOCK_READ(_lock); \ @@ -168,10 +139,8 @@ https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., #define MPFR_ONCE_INIT_VALUE PTHREAD_ONCE_INIT -#define MPFR_ONCE_CALL(_once, _func) do { \ - int error_code = pthread_once (&(_once), (_func)); \ - MPFR_ASSERTD (error_code == 0); \ - } while (0) +#define MPFR_ONCE_CALL(_once, _func) \ + MPFR_LOCK_C(pthread_once (&(_once), (_func))) #define MPFR_NEED_DEFERRED_INIT 1 |