Rev 1113 | Rev 1656 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1113 | Rev 1143 | ||
|---|---|---|---|
| Line 459... | Line 459... | ||
| 459 | #define MALLOC_ALIGNMENT ((size_t)8U) |
459 | #define MALLOC_ALIGNMENT ((size_t)8U) |
| 460 | #define FOOTERS 0 |
460 | #define FOOTERS 0 |
| 461 | #define ABORT abort() |
461 | #define ABORT abort() |
| 462 | #define ABORT_ON_ASSERT_FAILURE 1 |
462 | #define ABORT_ON_ASSERT_FAILURE 1 |
| 463 | #define PROCEED_ON_ERROR 0 |
463 | #define PROCEED_ON_ERROR 0 |
| 464 | #define USE_LOCKS 0 |
464 | #define USE_LOCKS 1 |
| 465 | #define INSECURE 0 |
465 | #define INSECURE 0 |
| 466 | #define HAVE_MMAP 0 |
466 | #define HAVE_MMAP 0 |
| 467 | 467 | ||
| 468 | #define MMAP_CLEARS 1 |
468 | #define MMAP_CLEARS 1 |
| 469 | 469 | ||
| Line 761... | Line 761... | ||
| 761 | 761 | ||
| 762 | * magic_init_mutex ensures that mparams.magic and other |
762 | * magic_init_mutex ensures that mparams.magic and other |
| 763 | unique mparams values are initialized only once. |
763 | unique mparams values are initialized only once. |
| 764 | */ |
764 | */ |
| 765 | 765 | ||
| 766 | #ifndef WIN32 |
- | |
| 767 | /* By default use posix locks */ |
766 | /* By default use posix locks */ |
| 768 | #include <pthread.h> |
767 | #include <futex.h> |
| 769 | #define MLOCK_T pthread_mutex_t |
768 | #define MLOCK_T atomic_t |
| 770 | #define INITIAL_LOCK(l) pthread_mutex_init(l, NULL) |
769 | #define INITIAL_LOCK(l) futex_initialize(l, 1) |
| - | 770 | /* futex_down cannot fail, but can return different |
|
| - | 771 | * retvals for OK |
|
| - | 772 | */ |
|
| 771 | #define ACQUIRE_LOCK(l) pthread_mutex_lock(l) |
773 | #define ACQUIRE_LOCK(l) ({futex_down(l);0;}) |
| 772 | #define RELEASE_LOCK(l) pthread_mutex_unlock(l) |
774 | #define RELEASE_LOCK(l) futex_up(l) |
| 773 | 775 | ||
| 774 | #if HAVE_MORECORE |
776 | #if HAVE_MORECORE |
| 775 | static MLOCK_T morecore_mutex = PTHREAD_MUTEX_INITIALIZER; |
777 | static MLOCK_T morecore_mutex = FUTEX_INITIALIZER; |
| 776 | #endif /* HAVE_MORECORE */ |
778 | #endif /* HAVE_MORECORE */ |
| 777 | 779 | ||
| 778 | static MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER; |
780 | static MLOCK_T magic_init_mutex = FUTEX_INITIALIZER; |
| 779 | 781 | ||
| 780 | #else /* WIN32 */ |
- | |
| 781 | /* |
- | |
| 782 | Because lock-protected regions have bounded times, and there |
- | |
| 783 | are no recursive lock calls, we can use simple spinlocks. |
- | |
| 784 | */ |
- | |
| 785 | - | ||
| 786 | #define MLOCK_T long |
- | |
| 787 | static int win32_acquire_lock (MLOCK_T *sl) { |
- | |
| 788 | for (;;) { |
- | |
| 789 | #ifdef InterlockedCompareExchangePointer |
- | |
| 790 | if (!InterlockedCompareExchange(sl, 1, 0)) |
- | |
| 791 | return 0; |
- | |
| 792 | #else /* Use older void* version */ |
- | |
| 793 | if (!InterlockedCompareExchange((void**)sl, (void*)1, (void*)0)) |
- | |
| 794 | return 0; |
- | |
| 795 | #endif /* InterlockedCompareExchangePointer */ |
- | |
| 796 | Sleep (0); |
- | |
| 797 | } |
- | |
| 798 | } |
- | |
| 799 | - | ||
| 800 | static void win32_release_lock (MLOCK_T *sl) { |
- | |
| 801 | InterlockedExchange (sl, 0); |
- | |
| 802 | } |
- | |
| 803 | - | ||
| 804 | #define INITIAL_LOCK(l) *(l)=0 |
- | |
| 805 | #define ACQUIRE_LOCK(l) win32_acquire_lock(l) |
- | |
| 806 | #define RELEASE_LOCK(l) win32_release_lock(l) |
- | |
| 807 | #if HAVE_MORECORE |
- | |
| 808 | static MLOCK_T morecore_mutex; |
- | |
| 809 | #endif /* HAVE_MORECORE */ |
- | |
| 810 | static MLOCK_T magic_init_mutex; |
- | |
| 811 | #endif /* WIN32 */ |
- | |
| 812 | 782 | ||
| 813 | #define USE_LOCK_BIT (2U) |
783 | #define USE_LOCK_BIT (2U) |
| 814 | #else /* USE_LOCKS */ |
784 | #else /* USE_LOCKS */ |
| 815 | #define USE_LOCK_BIT (0U) |
785 | #define USE_LOCK_BIT (0U) |
| 816 | #define INITIAL_LOCK(l) |
786 | #define INITIAL_LOCK(l) |