mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-05-02 22:25:04 -04:00
Reindroduce the read/write mutex for AuthGPG as mutex for the data member.
Added second mutex for the gpg engine. Now the call to the gpg engine (for example AuthGPGimpl::LoadCertificateFromString) doesn't block the GUI. The existing problem is still the call of AuthGPGimpl::storeAllKeys every minute before access the gpg data. git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@3555 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
0e460eec90
commit
d3fc7f3982
4 changed files with 238 additions and 166 deletions
|
@ -157,50 +157,49 @@ void RsQueueThread::run()
|
|||
}
|
||||
}
|
||||
|
||||
// maybe we can use it again
|
||||
//RsReadWriteMutex::RsReadWriteMutex():readLocks(0) {
|
||||
//}
|
||||
//
|
||||
//void RsReadWriteMutex::readLock() {
|
||||
// internalCounterMtx.lock();//lock internal read counter
|
||||
// if (readLocks == 0) {
|
||||
// lock(); //lock normal mutex
|
||||
// }
|
||||
// readLocks++;
|
||||
// internalCounterMtx.unlock();
|
||||
//}
|
||||
//
|
||||
//void RsReadWriteMutex::readUnlock() {
|
||||
// internalCounterMtx.lock();//lock internal read counter
|
||||
// if (readLocks == 1) {
|
||||
// unlock();
|
||||
// }
|
||||
// if (readLocks != 0) {
|
||||
// readLocks--;
|
||||
// }
|
||||
// internalCounterMtx.unlock();
|
||||
//}
|
||||
//
|
||||
//void RsReadWriteMutex::writeLock() {
|
||||
// lock();
|
||||
//}
|
||||
//
|
||||
//void RsReadWriteMutex::writeUnlock() {
|
||||
// unlock();
|
||||
//}
|
||||
//
|
||||
//void RsReadWriteMutex::rwlock(uint32_t type) {
|
||||
// if (type & READ_LOCK) {
|
||||
// readLock();
|
||||
// } else {
|
||||
// writeLock();
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//void RsReadWriteMutex::rwunlock(uint32_t type) {
|
||||
// if (type & READ_LOCK) {
|
||||
// readUnlock();
|
||||
// } else {
|
||||
// writeUnlock();
|
||||
// }
|
||||
//}
|
||||
RsReadWriteMutex::RsReadWriteMutex():readLocks(0) {
|
||||
}
|
||||
|
||||
void RsReadWriteMutex::readLock() {
|
||||
internalCounterMtx.lock();//lock internal read counter
|
||||
if (readLocks == 0) {
|
||||
lock(); //lock normal mutex
|
||||
}
|
||||
readLocks++;
|
||||
internalCounterMtx.unlock();
|
||||
}
|
||||
|
||||
void RsReadWriteMutex::readUnlock() {
|
||||
internalCounterMtx.lock();//lock internal read counter
|
||||
if (readLocks == 1) {
|
||||
unlock();
|
||||
}
|
||||
if (readLocks != 0) {
|
||||
readLocks--;
|
||||
}
|
||||
internalCounterMtx.unlock();
|
||||
}
|
||||
|
||||
void RsReadWriteMutex::writeLock() {
|
||||
lock();
|
||||
}
|
||||
|
||||
void RsReadWriteMutex::writeUnlock() {
|
||||
unlock();
|
||||
}
|
||||
|
||||
void RsReadWriteMutex::rwlock(uint32_t type) {
|
||||
if (type & READ_LOCK) {
|
||||
readLock();
|
||||
} else {
|
||||
writeLock();
|
||||
}
|
||||
}
|
||||
|
||||
void RsReadWriteMutex::rwunlock(uint32_t type) {
|
||||
if (type & READ_LOCK) {
|
||||
readUnlock();
|
||||
} else {
|
||||
writeUnlock();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -102,41 +102,40 @@ class RsStackMutex
|
|||
RsMutex &mMtx;
|
||||
};
|
||||
|
||||
// maybe we can use it again
|
||||
//class RsReadWriteMutex: public RsMutex
|
||||
//{
|
||||
// public:
|
||||
// RsReadWriteMutex();
|
||||
//
|
||||
// void readLock();
|
||||
// void readUnlock();
|
||||
// void writeLock();
|
||||
// void writeUnlock();
|
||||
//
|
||||
// void rwlock(uint32_t type);
|
||||
// void rwunlock(uint32_t type);
|
||||
//
|
||||
// const static uint32_t READ_LOCK = 0x0001;
|
||||
// const static uint32_t WRITE_LOCK = 0x0002;
|
||||
//
|
||||
//
|
||||
// private:
|
||||
// int readLocks;
|
||||
// RsMutex internalCounterMtx;
|
||||
//};
|
||||
//
|
||||
//class RsStackReadWriteMutex
|
||||
//{
|
||||
// public:
|
||||
//
|
||||
// RsStackReadWriteMutex(RsReadWriteMutex &mtx): mMtx(mtx) { mMtx.writeLock(); writeLock = true;}
|
||||
// RsStackReadWriteMutex(RsReadWriteMutex &mtx, uint32_t type): mMtx(mtx) { if (type == RsReadWriteMutex::READ_LOCK) {mMtx.readLock(); writeLock = false;} else {mMtx.writeLock(); writeLock = true;} }
|
||||
// ~RsStackReadWriteMutex() { if(writeLock) {mMtx.writeUnlock();} else {mMtx.readUnlock();} }
|
||||
//
|
||||
// private:
|
||||
// RsReadWriteMutex &mMtx;
|
||||
// bool writeLock;
|
||||
//};
|
||||
class RsReadWriteMutex: public RsMutex
|
||||
{
|
||||
public:
|
||||
RsReadWriteMutex();
|
||||
|
||||
void readLock();
|
||||
void readUnlock();
|
||||
void writeLock();
|
||||
void writeUnlock();
|
||||
|
||||
void rwlock(uint32_t type);
|
||||
void rwunlock(uint32_t type);
|
||||
|
||||
const static uint32_t READ_LOCK = 0x0001;
|
||||
const static uint32_t WRITE_LOCK = 0x0002;
|
||||
|
||||
|
||||
private:
|
||||
int readLocks;
|
||||
RsMutex internalCounterMtx;
|
||||
};
|
||||
|
||||
class RsStackReadWriteMutex
|
||||
{
|
||||
public:
|
||||
|
||||
RsStackReadWriteMutex(RsReadWriteMutex &mtx): mMtx(mtx) { mMtx.writeLock(); writeLock = true;}
|
||||
RsStackReadWriteMutex(RsReadWriteMutex &mtx, uint32_t type): mMtx(mtx) { if (type == RsReadWriteMutex::READ_LOCK) {mMtx.readLock(); writeLock = false;} else {mMtx.writeLock(); writeLock = true;} }
|
||||
~RsStackReadWriteMutex() { if(writeLock) {mMtx.writeUnlock();} else {mMtx.readUnlock();} }
|
||||
|
||||
private:
|
||||
RsReadWriteMutex &mMtx;
|
||||
bool writeLock;
|
||||
};
|
||||
|
||||
class RsThread;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue