[go: up one dir, main page]

Menu

[r1]: / comm / prec.cpp  Maximize  Restore  History

Download this file

106 lines (83 with data), 2.4 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
#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;
}