Index: src/UnwindCursor.hpp =================================================================== --- src/UnwindCursor.hpp +++ src/UnwindCursor.hpp @@ -17,7 +17,11 @@ #include #include #ifndef _LIBUNWIND_HAS_NO_THREADS - #include + #ifdef _WIN32 + #include + #else + #include + #endif #endif #include @@ -36,6 +40,34 @@ #include "Registers.hpp" #include "Unwind-EHABI.h" +#if !defined(_LIBUNWIND_HAS_NO_THREADS) && defined(_WIN32) +#define pthread_rwlock_t SRWLOCK +#define PTHREAD_RWLOCK_INITIALIZER SRWLOCK_INIT +// As long as these functions are only ever used with one lock, +// we can get away with a global flag to decide which kind of +// unlock to do. +static bool lockedForWrite = false; +static int pthread_rwlock_rdlock(pthread_rwlock_t *lock) { + AcquireSRWLockShared(lock); + lockedForWrite = false; + return 0; +} +static int pthread_rwlock_wrlock(pthread_rwlock_t *lock) { + AcquireSRWLockExclusive(lock); + lockedForWrite = true; + return 0; +} +static int pthread_rwlock_unlock(pthread_rwlock_t *lock) { + if (lockedForWrite) { + lockedForWrite = false; + ReleaseSRWLockExclusive(lock); + } else { + ReleaseSRWLockShared(lock); + } + return 0; +} +#endif + namespace libunwind { #if defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)