#1187 Thank You to Taras for the patch.
parent
41f14f2b7b
commit
b15a401569
@ -0,0 +1,138 @@
|
|||||||
|
#ifndef RW_LOCK_HPP
|
||||||
|
#define RW_LOCK_HPP
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#else
|
||||||
|
#include <pthread.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace Exiv2 {
|
||||||
|
namespace Internal {
|
||||||
|
#ifdef _WIN32
|
||||||
|
class RWLock
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RWLock()
|
||||||
|
{
|
||||||
|
InitializeSRWLock(&rwlock_);
|
||||||
|
}
|
||||||
|
|
||||||
|
~RWLock()
|
||||||
|
{
|
||||||
|
// do not explicitly destroy
|
||||||
|
}
|
||||||
|
|
||||||
|
void wrlock()
|
||||||
|
{
|
||||||
|
AcquireSRWLockExclusive(&rwlock_);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool trywrlock()
|
||||||
|
{
|
||||||
|
return TryAcquireSRWLockExclusive(&rwlock_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void rdlock()
|
||||||
|
{
|
||||||
|
AcquireSRWLockShared(&rwlock_);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool tryrdlock()
|
||||||
|
{
|
||||||
|
return TryAcquireSRWLockShared(&rwlock_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void rdunlock()
|
||||||
|
{
|
||||||
|
ReleaseSRWLockShared(&rwlock_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wrunlock()
|
||||||
|
{
|
||||||
|
ReleaseSRWLockExclusive(&rwlock_);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
SRWLOCK rwlock_;
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
class RWLock
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RWLock(const pthread_rwlockattr_t *attr = 0)
|
||||||
|
{
|
||||||
|
pthread_rwlock_init(&rwlock_, attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
~RWLock()
|
||||||
|
{
|
||||||
|
pthread_rwlock_destroy(&rwlock_);
|
||||||
|
}
|
||||||
|
|
||||||
|
int wrlock()
|
||||||
|
{
|
||||||
|
return pthread_rwlock_wrlock(&rwlock_);
|
||||||
|
}
|
||||||
|
|
||||||
|
int trywrlock()
|
||||||
|
{
|
||||||
|
return pthread_rwlock_trywrlock(&rwlock_);
|
||||||
|
}
|
||||||
|
|
||||||
|
int rdlock()
|
||||||
|
{
|
||||||
|
return pthread_rwlock_rdlock(&rwlock_);
|
||||||
|
}
|
||||||
|
|
||||||
|
int tryrdlock()
|
||||||
|
{
|
||||||
|
return pthread_rwlock_tryrdlock(&rwlock_);
|
||||||
|
}
|
||||||
|
|
||||||
|
int unlock()
|
||||||
|
{
|
||||||
|
return pthread_rwlock_unlock(&rwlock_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void rdunlock() { unlock(); }
|
||||||
|
void wrunlock() { unlock(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
pthread_rwlock_t rwlock_;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class ScopedReadLock
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ScopedReadLock(RWLock &rwlock):
|
||||||
|
rwlock_(rwlock)
|
||||||
|
{
|
||||||
|
rwlock_.rdlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
~ScopedReadLock() { rwlock_.rdunlock(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
RWLock &rwlock_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ScopedWriteLock
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ScopedWriteLock(RWLock &rwlock):
|
||||||
|
rwlock_(rwlock)
|
||||||
|
{
|
||||||
|
rwlock_.wrlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
~ScopedWriteLock() { rwlock_.wrunlock(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
RWLock &rwlock_;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // RW_LOCK_HPP
|
Loading…
Reference in New Issue