[go: up one dir, main page]

Menu

Diff of /comm/prec.cpp [000000] .. [r1]  Maximize  Restore

Switch to side-by-side view

--- a
+++ b/comm/prec.cpp
@@ -0,0 +1,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;
+}