Switched base class of TokenQueue from QWidget to QObject.

Fixed unlock of the mutex in TokenQueue.

git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.5-gxs-b1@5949 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
thunder2 2012-12-06 17:51:07 +00:00
parent de757cfcae
commit 0c49fba4d8
2 changed files with 39 additions and 31 deletions

View file

@ -32,7 +32,7 @@
/** Constructor */ /** Constructor */
TokenQueue::TokenQueue(RsTokenService *service, TokenResponse *resp) TokenQueue::TokenQueue(RsTokenService *service, TokenResponse *resp)
: QWidget(NULL), mService(service), mResponder(resp) : QObject(NULL), mService(service), mResponder(resp)
{ {
} }
@ -98,9 +98,9 @@ void TokenQueue::queueRequest(uint32_t token, uint32_t basictype, uint32_t ansty
gettimeofday(&req.mRequestTs, NULL); gettimeofday(&req.mRequestTs, NULL);
req.mPollTs = req.mRequestTs; req.mPollTs = req.mRequestTs;
mTokenMtx.lock(); mTokenMtx.lock();
mRequests.push_back(req); mRequests.push_back(req);
mTokenMtx.unlock(); mTokenMtx.unlock();
if (mRequests.size() == 1) if (mRequests.size() == 1)
{ {
@ -126,10 +126,10 @@ void TokenQueue::pollRequests()
TokenRequest req; TokenRequest req;
mTokenMtx.lock(); mTokenMtx.lock();
req = mRequests.front(); req = mRequests.front();
mRequests.pop_front(); mRequests.pop_front();
mTokenMtx.unlock(); mTokenMtx.unlock();
if (checkForRequest(req.mToken)) if (checkForRequest(req.mToken))
{ {
@ -144,9 +144,9 @@ void TokenQueue::pollRequests()
/* drop old requests too */ /* drop old requests too */
if (time(NULL) - req.mRequestTs.tv_sec < MAX_REQUEST_AGE) if (time(NULL) - req.mRequestTs.tv_sec < MAX_REQUEST_AGE)
{ {
mTokenMtx.lock(); mTokenMtx.lock();
mRequests.push_back(req); mRequests.push_back(req);
mTokenMtx.unlock(); mTokenMtx.unlock();
} }
else else
{ {
@ -172,36 +172,41 @@ bool TokenQueue::checkForRequest(uint32_t token)
bool TokenQueue::activeRequestExist(const uint32_t& userType) bool TokenQueue::activeRequestExist(const uint32_t& userType)
{ {
mTokenMtx.lock(); mTokenMtx.lock();
std::list<TokenRequest>::const_iterator lit = mRequests.begin(); std::list<TokenRequest>::const_iterator lit = mRequests.begin();
for(; lit != mRequests.end(); lit++) for(; lit != mRequests.end(); lit++)
{ {
const TokenRequest& req = *lit; const TokenRequest& req = *lit;
if(req.mUserType == userType) if(req.mUserType == userType)
return true; {
} mTokenMtx.unlock();
return true;
}
}
mTokenMtx.unlock(); mTokenMtx.unlock();
return false;
} }
void TokenQueue::activeRequestTokens(const uint32_t& userType, std::list<uint32_t>& tokens) void TokenQueue::activeRequestTokens(const uint32_t& userType, std::list<uint32_t>& tokens)
{ {
mTokenMtx.lock(); mTokenMtx.lock();
std::list<TokenRequest>::const_iterator lit = mRequests.begin(); std::list<TokenRequest>::const_iterator lit = mRequests.begin();
for(; lit != mRequests.end(); lit++) for(; lit != mRequests.end(); lit++)
{ {
const TokenRequest& req = *lit; const TokenRequest& req = *lit;
if(req.mUserType == userType) if(req.mUserType == userType)
tokens.push_back(req.mToken); tokens.push_back(req.mToken);
} }
mTokenMtx.unlock(); mTokenMtx.unlock();
} }
void TokenQueue::loadRequest(const TokenRequest &req) void TokenQueue::loadRequest(const TokenRequest &req)
@ -221,7 +226,7 @@ bool TokenQueue::cancelRequest(const uint32_t token)
std::list<TokenRequest>::iterator it; std::list<TokenRequest>::iterator it;
mTokenMtx.lock(); mTokenMtx.lock();
for(it = mRequests.begin(); it != mRequests.end(); it++) for(it = mRequests.begin(); it != mRequests.end(); it++)
{ {
if (it->mToken == token) if (it->mToken == token)
@ -231,10 +236,12 @@ bool TokenQueue::cancelRequest(const uint32_t token)
std::cerr << "TokenQueue::cancelRequest() Cleared Request: " << token; std::cerr << "TokenQueue::cancelRequest() Cleared Request: " << token;
std::cerr << std::endl; std::cerr << std::endl;
mTokenMtx.unlock();
return true; return true;
} }
} }
mTokenMtx.unlock(); mTokenMtx.unlock();
std::cerr << "TokenQueue::cancelRequest() Failed to Find Request: " << token; std::cerr << "TokenQueue::cancelRequest() Failed to Find Request: " << token;
std::cerr << std::endl; std::cerr << std::endl;

View file

@ -67,7 +67,7 @@ public:
* An important thing to note is that all requests are stacked (so FIFO) * An important thing to note is that all requests are stacked (so FIFO)
* This is to prevent overlapped loads on GXS UIs * This is to prevent overlapped loads on GXS UIs
*/ */
class TokenQueue: public QWidget class TokenQueue: public QObject
{ {
Q_OBJECT Q_OBJECT
@ -100,8 +100,9 @@ public:
bool checkForRequest(uint32_t token); bool checkForRequest(uint32_t token);
void loadRequest(const TokenRequest &req); void loadRequest(const TokenRequest &req);
bool activeRequestExist(const uint32_t& userType); bool activeRequestExist(const uint32_t& userType);
void activeRequestTokens(const uint32_t& userType, std::list<uint32_t>& tokens); void activeRequestTokens(const uint32_t& userType, std::list<uint32_t>& tokens);
protected: protected:
void doPoll(float dt); void doPoll(float dt);
@ -114,7 +115,7 @@ private:
RsTokenService *mService; RsTokenService *mService;
TokenResponse *mResponder; TokenResponse *mResponder;
QMutex mTokenMtx; QMutex mTokenMtx;
QTimer *mTrigger; QTimer *mTrigger;
}; };