mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-01-26 07:16:11 -05:00
Reviewed Mutex in pqihandler.
- In general it is okay, except for: DataRate Handling, and Win32 specific: WaitingList. - Cleaned up some functions. - renamed createPerson and createListener to locked_createPerson and locked_createListener. This is required as neither Listener nor Person are thread safe (TODO). git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@5888 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
696e7735a1
commit
0fa8d55062
@ -194,7 +194,7 @@ bool pqihandler::RemoveSearchModule(SearchModule *mod)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// dummy output check
|
// dummy output check
|
||||||
int pqihandler::locked_checkOutgoingRsItem(RsItem */*item*/, int /*global*/)
|
int pqihandler::locked_checkOutgoingRsItem(RsItem * /*item*/, int /*global*/)
|
||||||
{
|
{
|
||||||
//pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, "pqihandler::checkOutgoingPQItem() NULL fn");
|
//pqioutput(PQL_DEBUG_BASIC, pqihandlerzone, "pqihandler::checkOutgoingPQItem() NULL fn");
|
||||||
|
|
||||||
|
@ -119,12 +119,13 @@ int pqipersongrp::tick()
|
|||||||
* but not to important.
|
* but not to important.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
{ RsStackMutex stack(coreMtx); /**************** LOCKED MUTEX ****************/
|
{
|
||||||
if (pqil)
|
RsStackMutex stack(coreMtx); /******* LOCKED MUTEX **********/
|
||||||
{
|
if (pqil)
|
||||||
pqil -> tick();
|
{
|
||||||
}
|
pqil -> tick();
|
||||||
} /* UNLOCKED */
|
}
|
||||||
|
} /* UNLOCKED */
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
@ -158,12 +159,13 @@ int pqipersongrp::tick()
|
|||||||
|
|
||||||
int pqipersongrp::status()
|
int pqipersongrp::status()
|
||||||
{
|
{
|
||||||
{ RsStackMutex stack(coreMtx); /**************** LOCKED MUTEX ****************/
|
{
|
||||||
if (pqil)
|
RsStackMutex stack(coreMtx); /******* LOCKED MUTEX **********/
|
||||||
{
|
if (pqil)
|
||||||
pqil -> status();
|
{
|
||||||
}
|
pqil -> status();
|
||||||
} /* UNLOCKED */
|
}
|
||||||
|
} /* UNLOCKED */
|
||||||
|
|
||||||
return pqihandler::status();
|
return pqihandler::status();
|
||||||
}
|
}
|
||||||
@ -175,6 +177,7 @@ int pqipersongrp::init_listener()
|
|||||||
/* extract our information from the p3ConnectMgr */
|
/* extract our information from the p3ConnectMgr */
|
||||||
if (initFlags & PQIPERSON_NO_LISTENER)
|
if (initFlags & PQIPERSON_NO_LISTENER)
|
||||||
{
|
{
|
||||||
|
RsStackMutex stack(coreMtx); /******* LOCKED MUTEX **********/
|
||||||
pqil = NULL;
|
pqil = NULL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -183,8 +186,8 @@ int pqipersongrp::init_listener()
|
|||||||
*/
|
*/
|
||||||
struct sockaddr_in laddr = mLinkMgr->getLocalAddress();
|
struct sockaddr_in laddr = mLinkMgr->getLocalAddress();
|
||||||
|
|
||||||
RsStackMutex stack(coreMtx); /**************** LOCKED MUTEX ****************/
|
RsStackMutex stack(coreMtx); /******* LOCKED MUTEX **********/
|
||||||
pqil = createListener(laddr);
|
pqil = locked_createListener(laddr);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -199,7 +202,7 @@ bool pqipersongrp::resetListener(struct sockaddr_in &local)
|
|||||||
// change the address.
|
// change the address.
|
||||||
// restart.
|
// restart.
|
||||||
|
|
||||||
RsStackMutex stack(coreMtx); /**************** LOCKED MUTEX ****************/
|
RsStackMutex stack(coreMtx); /******* LOCKED MUTEX **********/
|
||||||
|
|
||||||
if (pqil != NULL)
|
if (pqil != NULL)
|
||||||
{
|
{
|
||||||
@ -391,33 +394,24 @@ int pqipersongrp::addPeer(std::string id)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
SearchModule *sm = NULL;
|
SearchModule *sm = NULL;
|
||||||
{ RsStackMutex stack(coreMtx); /**************** LOCKED MUTEX ****************/
|
|
||||||
std::map<std::string, SearchModule *>::iterator it;
|
|
||||||
it = mods.find(id);
|
|
||||||
if (it != mods.end())
|
|
||||||
{
|
|
||||||
pqioutput(PQL_DEBUG_BASIC, pqipersongrpzone,
|
|
||||||
"pqipersongrp::addPeer() Peer already in Use!");
|
|
||||||
|
|
||||||
std::cerr << " pqipersongrp::addPeer() ERROR Peer already in use! id: " << id;
|
{
|
||||||
std::cerr << std::endl;
|
// The Mutex is required here as pqiListener is not thread-safe.
|
||||||
|
RsStackMutex stack(coreMtx); /******* LOCKED MUTEX **********/
|
||||||
|
pqiperson *pqip = locked_createPerson(id, pqil);
|
||||||
|
|
||||||
|
// attach to pqihandler
|
||||||
|
sm = new SearchModule();
|
||||||
|
sm -> peerid = id;
|
||||||
|
sm -> pqi = pqip;
|
||||||
|
sm -> sp = secpolicy_create();
|
||||||
|
|
||||||
|
// reset it to start it working.
|
||||||
|
pqioutput(PQL_WARNING, pqipersongrpzone, "pqipersongrp::addPeer() => reset() called to initialise new person");
|
||||||
|
pqip -> reset();
|
||||||
|
pqip -> listen();
|
||||||
|
|
||||||
return -1;
|
} /* UNLOCKED */
|
||||||
}
|
|
||||||
|
|
||||||
pqiperson *pqip = createPerson(id, pqil);
|
|
||||||
|
|
||||||
// attach to pqihandler
|
|
||||||
sm = new SearchModule();
|
|
||||||
sm -> peerid = id;
|
|
||||||
sm -> pqi = pqip;
|
|
||||||
sm -> sp = secpolicy_create();
|
|
||||||
|
|
||||||
// reset it to start it working.
|
|
||||||
pqioutput(PQL_WARNING, pqipersongrpzone, "pqipersongrp::addPeer() => reset() called to initialise new person");
|
|
||||||
pqip -> reset();
|
|
||||||
pqip -> listen();
|
|
||||||
} /* UNLOCKED */
|
|
||||||
|
|
||||||
return AddSearchModule(sm);
|
return AddSearchModule(sm);
|
||||||
}
|
}
|
||||||
@ -438,8 +432,6 @@ int pqipersongrp::removePeer(std::string id)
|
|||||||
if (it != mods.end())
|
if (it != mods.end())
|
||||||
{
|
{
|
||||||
SearchModule *mod = it->second;
|
SearchModule *mod = it->second;
|
||||||
// Don't duplicate remove!!!
|
|
||||||
//RemoveSearchModule(mod);
|
|
||||||
secpolicy_delete(mod -> sp);
|
secpolicy_delete(mod -> sp);
|
||||||
pqiperson *p = (pqiperson *) mod -> pqi;
|
pqiperson *p = (pqiperson *) mod -> pqi;
|
||||||
p -> stoplistening();
|
p -> stoplistening();
|
||||||
@ -491,15 +483,12 @@ int pqipersongrp::connectPeer(std::string id
|
|||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
|
||||||
/* get status from p3connectMgr */
|
|
||||||
#ifdef PGRP_DEBUG
|
|
||||||
std::cerr << " pqipersongrp::connectPeer() id: " << id << " does nothing yet! ";
|
|
||||||
std::cerr << std::endl;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{
|
{
|
||||||
RsStackMutex stack(coreMtx); /**************** LOCKED MUTEX ****************/
|
RsStackMutex stack(coreMtx); /**************** LOCKED MUTEX ****************/
|
||||||
|
|
||||||
|
if (!mLinkMgr)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (id == mLinkMgr->getOwnId())
|
if (id == mLinkMgr->getOwnId())
|
||||||
{
|
{
|
||||||
#ifdef PGRP_DEBUG
|
#ifdef PGRP_DEBUG
|
||||||
@ -517,11 +506,6 @@ int pqipersongrp::connectPeer(std::string id
|
|||||||
SearchModule *mod = it->second;
|
SearchModule *mod = it->second;
|
||||||
pqiperson *p = (pqiperson *) mod -> pqi;
|
pqiperson *p = (pqiperson *) mod -> pqi;
|
||||||
|
|
||||||
|
|
||||||
/* get address from p3connmgr */
|
|
||||||
if (!mLinkMgr)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
#ifdef WINDOWS_SYS
|
#ifdef WINDOWS_SYS
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
// hack for too many connections
|
// hack for too many connections
|
||||||
@ -653,10 +637,6 @@ int pqipersongrp::connectPeer(std::string id
|
|||||||
|
|
||||||
p->connect(ptype, addr, proxyaddr, srcaddr, delay, period, timeout, flags, bandwidth);
|
p->connect(ptype, addr, proxyaddr, srcaddr, delay, period, timeout, flags, bandwidth);
|
||||||
|
|
||||||
} /* UNLOCKED */
|
|
||||||
|
|
||||||
|
|
||||||
/* */
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -687,14 +667,14 @@ bool pqipersongrp::notifyConnect(std::string id, uint32_t ptype, bool success
|
|||||||
|
|
||||||
#include "pqi/pqibin.h"
|
#include "pqi/pqibin.h"
|
||||||
|
|
||||||
pqilistener * pqipersongrpDummy::createListener(struct sockaddr_in /*laddr*/)
|
pqilistener * pqipersongrpDummy::locked_createListener(struct sockaddr_in /*laddr*/)
|
||||||
{
|
{
|
||||||
pqilistener *listener = new pqilistener();
|
pqilistener *listener = new pqilistener();
|
||||||
return listener;
|
return listener;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pqiperson * pqipersongrpDummy::createPerson(std::string id, pqilistener */*listener*/)
|
pqiperson * pqipersongrpDummy::locked_createPerson(std::string id, pqilistener * /*listener*/)
|
||||||
{
|
{
|
||||||
pqioutput(PQL_DEBUG_BASIC, pqipersongrpzone, "pqipersongrpDummy::createPerson() PeerId: " + id);
|
pqioutput(PQL_DEBUG_BASIC, pqipersongrpzone, "pqipersongrpDummy::createPerson() PeerId: " + id);
|
||||||
|
|
||||||
|
@ -97,8 +97,9 @@ virtual int status();
|
|||||||
protected:
|
protected:
|
||||||
|
|
||||||
/********* FUNCTIONS to OVERLOAD for specialisation ********/
|
/********* FUNCTIONS to OVERLOAD for specialisation ********/
|
||||||
virtual pqilistener *createListener(struct sockaddr_in laddr) = 0;
|
// THESE NEED TO BE LOCKED UNTIL PQILISTENER IS THREAD-SAFE.
|
||||||
virtual pqiperson *createPerson(std::string id, pqilistener *listener) = 0;
|
virtual pqilistener *locked_createListener(struct sockaddr_in laddr) = 0;
|
||||||
|
virtual pqiperson *locked_createPerson(std::string id, pqilistener *listener) = 0;
|
||||||
/********* FUNCTIONS to OVERLOAD for specialisation ********/
|
/********* FUNCTIONS to OVERLOAD for specialisation ********/
|
||||||
|
|
||||||
/* Overloaded RsItem Check
|
/* Overloaded RsItem Check
|
||||||
@ -131,8 +132,8 @@ class pqipersongrpDummy: public pqipersongrp
|
|||||||
protected:
|
protected:
|
||||||
|
|
||||||
/********* FUNCTIONS to OVERLOAD for specialisation ********/
|
/********* FUNCTIONS to OVERLOAD for specialisation ********/
|
||||||
virtual pqilistener *createListener(struct sockaddr_in laddr);
|
virtual pqilistener *locked_createListener(struct sockaddr_in laddr);
|
||||||
virtual pqiperson *createPerson(std::string id, pqilistener *listener);
|
virtual pqiperson *locked_createPerson(std::string id, pqilistener *listener);
|
||||||
/********* FUNCTIONS to OVERLOAD for specialisation ********/
|
/********* FUNCTIONS to OVERLOAD for specialisation ********/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -49,13 +49,13 @@ const int pqipersongrpzone = 354;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
pqilistener * pqisslpersongrp::createListener(struct sockaddr_in laddr)
|
pqilistener * pqisslpersongrp::locked_createListener(struct sockaddr_in laddr)
|
||||||
{
|
{
|
||||||
pqilistener *listener = new pqissllistener(laddr, mPeerMgr);
|
pqilistener *listener = new pqissllistener(laddr, mPeerMgr);
|
||||||
return listener;
|
return listener;
|
||||||
}
|
}
|
||||||
|
|
||||||
pqiperson * pqisslpersongrp::createPerson(std::string id, pqilistener *listener)
|
pqiperson * pqisslpersongrp::locked_createPerson(std::string id, pqilistener *listener)
|
||||||
{
|
{
|
||||||
pqioutput(PQL_DEBUG_BASIC, pqipersongrpzone, "pqipersongrp::createPerson() PeerId: " + id);
|
pqioutput(PQL_DEBUG_BASIC, pqipersongrpzone, "pqipersongrp::createPerson() PeerId: " + id);
|
||||||
|
|
||||||
|
@ -41,8 +41,8 @@ class pqisslpersongrp: public pqipersongrp
|
|||||||
protected:
|
protected:
|
||||||
|
|
||||||
/********* FUNCTIONS to OVERLOAD for specialisation ********/
|
/********* FUNCTIONS to OVERLOAD for specialisation ********/
|
||||||
virtual pqilistener *createListener(struct sockaddr_in laddr);
|
virtual pqilistener *locked_createListener(struct sockaddr_in laddr);
|
||||||
virtual pqiperson *createPerson(std::string id, pqilistener *listener);
|
virtual pqiperson *locked_createPerson(std::string id, pqilistener *listener);
|
||||||
/********* FUNCTIONS to OVERLOAD for specialisation ********/
|
/********* FUNCTIONS to OVERLOAD for specialisation ********/
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user