mirror of https://github.com/Icinga/icinga2.git
parent
02a7d97b17
commit
83a2e4c350
|
@ -52,6 +52,39 @@ static void InitThinMutex(void)
|
||||||
INITIALIZE_ONCE(&InitThinMutex);
|
INITIALIZE_ONCE(&InitThinMutex);
|
||||||
#endif /* _DEBUG */
|
#endif /* _DEBUG */
|
||||||
|
|
||||||
|
void ThinMutex::LockSlowPath(void)
|
||||||
|
{
|
||||||
|
LockSlowPath(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThinMutex::LockSlowPath(bool make_native)
|
||||||
|
{
|
||||||
|
unsigned int it = 0;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
# ifdef _WIN64
|
||||||
|
while (InterlockedCompareExchange64(&m_Data, THINLOCK_LOCKED, THINLOCK_UNLOCKED) != THINLOCK_UNLOCKED) {
|
||||||
|
# else /* _WIN64 */
|
||||||
|
while (InterlockedCompareExchange(&m_Data, THINLOCK_LOCKED, THINLOCK_UNLOCKED) != THINLOCK_UNLOCKED) {
|
||||||
|
# endif /* _WIN64 */
|
||||||
|
#else /* _WIN32 */
|
||||||
|
while (!__sync_bool_compare_and_swap(&m_Data, THINLOCK_UNLOCKED, THINLOCK_LOCKED)) {
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
if (m_Data > THINLOCK_LOCKED) {
|
||||||
|
LockNative();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
make_native = true;
|
||||||
|
|
||||||
|
Spin(it);
|
||||||
|
it++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (make_native)
|
||||||
|
MakeNative();
|
||||||
|
}
|
||||||
|
|
||||||
void ThinMutex::MakeNative(void)
|
void ThinMutex::MakeNative(void)
|
||||||
{
|
{
|
||||||
boost::mutex *mtx = new boost::mutex();
|
boost::mutex *mtx = new boost::mutex();
|
||||||
|
|
|
@ -69,32 +69,21 @@ public:
|
||||||
|
|
||||||
inline void Lock(bool make_native = false)
|
inline void Lock(bool make_native = false)
|
||||||
{
|
{
|
||||||
bool contended = false;
|
|
||||||
unsigned int it = 0;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
# ifdef _WIN64
|
# ifdef _WIN64
|
||||||
while (InterlockedCompareExchange64(&m_Data, THINLOCK_LOCKED, THINLOCK_UNLOCKED) != THINLOCK_UNLOCKED) {
|
if (InterlockedCompareExchange64(&m_Data, THINLOCK_LOCKED, THINLOCK_UNLOCKED) != THINLOCK_UNLOCKED) {
|
||||||
# else /* _WIN64 */
|
# else /* _WIN64 */
|
||||||
while (InterlockedCompareExchange(&m_Data, THINLOCK_LOCKED, THINLOCK_UNLOCKED) != THINLOCK_UNLOCKED) {
|
if (InterlockedCompareExchange(&m_Data, THINLOCK_LOCKED, THINLOCK_UNLOCKED) != THINLOCK_UNLOCKED) {
|
||||||
# endif /* _WIN64 */
|
# endif /* _WIN64 */
|
||||||
#else /* _WIN32 */
|
#else /* _WIN32 */
|
||||||
while (!__sync_bool_compare_and_swap(&m_Data, THINLOCK_UNLOCKED, THINLOCK_LOCKED)) {
|
if (!__sync_bool_compare_and_swap(&m_Data, THINLOCK_UNLOCKED, THINLOCK_LOCKED)) {
|
||||||
#endif /* _WIN32 */
|
#endif /* _WIN32 */
|
||||||
if (m_Data > THINLOCK_LOCKED) {
|
LockSlowPath();
|
||||||
LockNative();
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
contended = true;
|
void LockSlowPath(void);
|
||||||
|
void LockSlowPath(bool make_native);
|
||||||
Spin(it);
|
|
||||||
it++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (contended || make_native)
|
|
||||||
MakeNative();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void Unlock(void)
|
inline void Unlock(void)
|
||||||
{
|
{
|
||||||
|
@ -112,7 +101,7 @@ public:
|
||||||
|
|
||||||
inline void Inflate(void)
|
inline void Inflate(void)
|
||||||
{
|
{
|
||||||
Lock(true);
|
LockSlowPath(true);
|
||||||
Unlock();
|
Unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue