#include <sys/time.h>
#include <time.h>
#include <prec.h>
CPeerManagement::CPeerManagement()
{
pthread_mutex_init(&m_PeerRecLock, NULL);
}
CPeerManagement::~CPeerManagement()
{
pthread_mutex_destroy(&m_PeerRecLock);
}
void CPeerManagement::insert(const string& ip, const int& port, const int& session, const int32_t& id, const int& rtt)
{
pthread_mutex_lock(&m_PeerRecLock);
CPeerRecord* pr = new CPeerRecord;
pr->m_strIP = ip;
pr->m_iPort = port;
pr->m_iSession = session;
set<CPeerRecord*, CFPeerRec>::iterator i = m_sPeerRec.find(pr);
if (i != m_sPeerRec.end())
{
if (id > 0)
(*i)->m_iID = id;
if (rtt > 0)
(*i)->m_iRTT = rtt;
gettimeofday(&((*i)->m_TimeStamp), 0);
delete pr;
}
else
{
if (id > 0)
pr->m_iID = id;
if (rtt > 0)
pr->m_iRTT = rtt;
gettimeofday(&(pr->m_TimeStamp), 0);
m_sPeerRec.insert(pr);
m_sPeerRecByTS.insert(pr);
m_sPeerRecByIP.insert(pr);
if (m_sPeerRecByTS.size() > m_iRecLimit)
{
// delete first one
set<CPeerRecord*, CFPeerRecByTS>::iterator j = m_sPeerRecByTS.begin();
CPeerRecord* t = *j;
m_sPeerRec.erase(t);
pair<set<CPeerRecord*, CFPeerRecByIP>::iterator, set<CPeerRecord*, CFPeerRecByIP>::iterator> p = m_sPeerRecByIP.equal_range(t);
for (set<CPeerRecord*, CFPeerRecByIP>::iterator k = p.first; k != p.second; k ++)
{
if ((*k)->m_iPort == t->m_iPort)
{
m_sPeerRecByIP.erase(k);
}
}
delete t;
m_sPeerRecByTS.erase(j);
}
}
pthread_mutex_unlock(&m_PeerRecLock);
}
int CPeerManagement::getRTT(const string& ip)
{
pair<set<CPeerRecord*, CFPeerRecByIP>::iterator, set<CPeerRecord*, CFPeerRecByIP>::iterator> p;
CPeerRecord pr;
pr.m_strIP = ip;
p = m_sPeerRecByIP.equal_range(&pr);
for (set<CPeerRecord*, CFPeerRecByIP>::iterator i = p.first; i != p.second; i ++)
{
if ((*i)->m_iRTT > 0)
return (*i)->m_iRTT;
}
return -1;
}
int CPeerManagement::getLastID(const string& ip, const int& port, const int& session)
{
CPeerRecord pr;
pr.m_strIP = ip;
pr.m_iPort = port;
pr.m_iSession = session;
set<CPeerRecord*, CFPeerRec>::iterator i = m_sPeerRec.find(&pr);
if (i == m_sPeerRec.end())
return -1;
else
return (*i)->m_iID;
}