CPeer::m_Clients is a list

pull/1/head
Tom Early 6 years ago
parent 811e950e91
commit c84965983a

@ -1,6 +1,9 @@
// //
// cbmpeer.cpp // cbmpeer.cpp
// xlxd // xlxd
// Created by Jean-Luc Deltombe (LX3JL) on 10/12/2016.
// Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved.
// Copyright © 2020 Thomas A. Early, N7TAE
// //
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// This file is part of xlxd. // This file is part of xlxd.
@ -52,15 +55,9 @@ CBmPeer::CBmPeer(const CCallsign &callsign, const CIp &ip, const char *modules,
CBmPeer::CBmPeer(const CBmPeer &peer) CBmPeer::CBmPeer(const CBmPeer &peer)
: CPeer(peer) : CPeer(peer)
{ {
for ( int i = 0; i < peer.m_Clients.size(); i++ ) for ( auto it=peer.cbegin(); it!=peer.cend(); it++ )
{ {
CBmClient *client = new CBmClient((const CBmClient &)*(peer.m_Clients[i])); CBmClient *client = new CBmClient((const CBmClient &)*(*it));
// grow vector capacity if needed
if ( m_Clients.capacity() == m_Clients.size() )
{
m_Clients.reserve(m_Clients.capacity()+10);
}
// and append
m_Clients.push_back(client); m_Clients.push_back(client);
} }
@ -88,4 +85,3 @@ int CBmPeer::GetProtocolRevision(const CVersion &version)
{ {
return XLX_PROTOCOL_REVISION_2; return XLX_PROTOCOL_REVISION_2;
} }

@ -4,6 +4,7 @@
// //
// Created by Antony Chazapis (SV9OAN) on 25/2/2018. // Created by Antony Chazapis (SV9OAN) on 25/2/2018.
// Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved. // Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved.
// Copyright © 2020 Thomas A. Early, N7TAE
// //
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// This file is part of xlxd. // This file is part of xlxd.
@ -55,15 +56,9 @@ CDextraPeer::CDextraPeer(const CCallsign &callsign, const CIp &ip, const char *m
CDextraPeer::CDextraPeer(const CDextraPeer &peer) CDextraPeer::CDextraPeer(const CDextraPeer &peer)
: CPeer(peer) : CPeer(peer)
{ {
for ( int i = 0; i < peer.m_Clients.size(); i++ ) for ( auto it=peer.cbegin(); it!=peer.cend(); it++ )
{ {
CDextraClient *client = new CDextraClient((const CDextraClient &)*(peer.m_Clients[i])); CDextraClient *client = new CDextraClient((const CDextraClient &)*(*it));
// grow vector capacity if needed
if ( m_Clients.capacity() == m_Clients.size() )
{
m_Clients.reserve(m_Clients.capacity()+10);
}
// and append
m_Clients.push_back(client); m_Clients.push_back(client);
} }
@ -81,12 +76,12 @@ CDextraPeer::~CDextraPeer()
bool CDextraPeer::IsAlive(void) const bool CDextraPeer::IsAlive(void) const
{ {
bool alive = true; for ( auto it=cbegin(); it!=cend(); it++ )
for ( int i = 0; (i < m_Clients.size()) && alive ; i++ )
{ {
alive &= m_Clients[i]->IsAlive(); if (! (*it)->IsAlive())
return false;
} }
return alive; return true;
} }
//////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////
@ -96,4 +91,3 @@ int CDextraPeer::GetProtocolRevision(const CVersion &version)
{ {
return version.GetMajor(); return version.GetMajor();
} }

@ -352,9 +352,9 @@ void CDextraProtocol::HandleKeepalives(void)
CBuffer disconnect; CBuffer disconnect;
EncodeDisconnectPacket(&disconnect, peer->GetReflectorModules()[0]); EncodeDisconnectPacket(&disconnect, peer->GetReflectorModules()[0]);
CClients *clients = g_Reflector.GetClients(); CClients *clients = g_Reflector.GetClients();
for ( int i = 0; i < peer->GetNbClients(); i++ ) for ( auto cit=peer->cbegin(); cit!=peer->cend(); cit++ )
{ {
m_Socket.Send(disconnect, peer->GetClient(i)->GetIp()); m_Socket.Send(disconnect, (*cit)->GetIp());
} }
g_Reflector.ReleaseClients(); g_Reflector.ReleaseClients();

@ -4,6 +4,7 @@
// //
// Created by Jean-Luc Deltombe (LX3JL) on 104/03/2017. // Created by Jean-Luc Deltombe (LX3JL) on 104/03/2017.
// Copyright © 2015 Jean-Luc Deltombe (LX3JL). All rights reserved. // Copyright © 2015 Jean-Luc Deltombe (LX3JL). All rights reserved.
// Copyright © 2020 Thomas A. Early, N7TAE
// //
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// This file is part of xlxd. // This file is part of xlxd.

@ -4,6 +4,7 @@
// //
// Created by Jean-Luc Deltombe (LX3JL) on 10/12/2016. // Created by Jean-Luc Deltombe (LX3JL) on 10/12/2016.
// Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved. // Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved.
// Copyright © 2020 Thomas A. Early, N7TAE
// //
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// This file is part of xlxd. // This file is part of xlxd.
@ -35,7 +36,6 @@
CPeer::CPeer() CPeer::CPeer()
{ {
::memset(m_ReflectorModules, 0, sizeof(m_ReflectorModules)); ::memset(m_ReflectorModules, 0, sizeof(m_ReflectorModules));
m_Clients.reserve(100);
m_ConnectTime = std::time(NULL); m_ConnectTime = std::time(NULL);
m_LastHeardTime = std::time(NULL); m_LastHeardTime = std::time(NULL);
} }
@ -68,9 +68,9 @@ CPeer::CPeer(const CPeer &peer)
CPeer::~CPeer() CPeer::~CPeer()
{ {
for ( int i = 0; i < m_Clients.size(); i++ ) for ( auto it=begin(); it!=end(); it++ )
{ {
delete m_Clients[i]; delete *it;
} }
m_Clients.clear(); m_Clients.clear();
} }
@ -80,16 +80,26 @@ CPeer::~CPeer()
bool CPeer::operator ==(const CPeer &peer) const bool CPeer::operator ==(const CPeer &peer) const
{ {
bool same = true; if (peer.m_Callsign != m_Callsign)
return false;
same &= (peer.m_Callsign == m_Callsign); if (peer.m_Ip != m_Ip)
same &= (peer.m_Ip == m_Ip); return false;
same &= (peer.m_Version == m_Version); if (! (peer.m_Version == m_Version))
for ( int i = 0; (i < m_Clients.size()) && same ; i++ ) return false;
auto it1 = cbegin();
auto it2 = peer.cbegin();
while (true)
{ {
same &= (peer.m_Clients[i] == m_Clients[i]); if (it1==cend() && it2==peer.cend())
break;
if (it1==cend() || it2==peer.cend())
return false;
if (*it1 != *it2)
return false;
it1++;
it2++;
} }
return same; return true;
} }
@ -98,42 +108,23 @@ bool CPeer::operator ==(const CPeer &peer) const
bool CPeer::IsAMaster(void) const bool CPeer::IsAMaster(void) const
{ {
bool master = false; for ( auto it=cbegin(); it!=cend(); it++ )
for ( int i = 0; (i < m_Clients.size()) && !master ; i++ )
{ {
master |= m_Clients[i]->IsAMaster(); if ((*it)->IsAMaster())
return true;
} }
return master; return false;
} }
void CPeer::Alive(void) void CPeer::Alive(void)
{ {
m_LastKeepaliveTime.Now();; m_LastKeepaliveTime.Now();;
for ( int i = 0; i < m_Clients.size(); i++ ) for ( auto it=begin(); it!=end(); it++ )
{
m_Clients[i]->Alive();
}
}
////////////////////////////////////////////////////////////////////////////////////////
// manage clients
CClient *CPeer::GetClient(int i)
{
if ( (i >= 0) && (i < m_Clients.size()) )
{
return m_Clients[i];
}
else
{ {
return NULL; (*it)->Alive();
} }
} }
////////////////////////////////////////////////////////////////////////////////////////
// reporting
//////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////
// reporting // reporting

@ -4,6 +4,7 @@
// //
// Created by Jean-Luc Deltombe (LX3JL) on 10/12/2016. // Created by Jean-Luc Deltombe (LX3JL) on 10/12/2016.
// Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved. // Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved.
// Copyright © 2020 Thomas A. Early, N7TAE
// //
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// This file is part of xlxd. // This file is part of xlxd.
@ -72,7 +73,12 @@ public:
// clients access // clients access
int GetNbClients(void) const { return (int)m_Clients.size(); } int GetNbClients(void) const { return (int)m_Clients.size(); }
void ClearClients(void) { m_Clients.clear(); } void ClearClients(void) { m_Clients.clear(); }
CClient *GetClient(int);
// pass-thru
std::list<CClient *>::iterator begin() { return m_Clients.begin(); }
std::list<CClient *>::iterator end() { return m_Clients.end(); }
std::list<CClient *>::const_iterator cbegin() const { return m_Clients.cbegin(); }
std::list<CClient *>::const_iterator cend() const { return m_Clients.cend(); }
// reporting // reporting
virtual void WriteXml(std::ofstream &); virtual void WriteXml(std::ofstream &);
@ -84,7 +90,7 @@ protected:
CIp m_Ip; CIp m_Ip;
char m_ReflectorModules[NB_MODULES_MAX+1]; char m_ReflectorModules[NB_MODULES_MAX+1];
CVersion m_Version; CVersion m_Version;
std::vector<CClient *> m_Clients; std::list<CClient *> m_Clients;
// status // status
CTimePoint m_LastKeepaliveTime; CTimePoint m_LastKeepaliveTime;

@ -4,6 +4,7 @@
// //
// Created by Jean-Luc Deltombe (LX3JL) on 10/12/2016. // Created by Jean-Luc Deltombe (LX3JL) on 10/12/2016.
// Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved. // Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved.
// Copyright © 2020 Thomas A. Early, N7TAE
// //
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// This file is part of xlxd. // This file is part of xlxd.
@ -89,9 +90,9 @@ void CPeers::AddPeer(CPeer *peer)
// and append all peer's client to reflector client list // and append all peer's client to reflector client list
// it is double lock safe to lock Clients list after Peers list // it is double lock safe to lock Clients list after Peers list
CClients *clients = g_Reflector.GetClients(); CClients *clients = g_Reflector.GetClients();
for ( int i = 0; i < peer->GetNbClients(); i++ ) for ( auto cit=peer->cbegin(); cit!=peer->cend(); cit++ )
{ {
clients->AddClient(peer->GetClient(i)); clients->AddClient(*cit);
} }
g_Reflector.ReleaseClients(); g_Reflector.ReleaseClients();
@ -115,10 +116,10 @@ void CPeers::RemovePeer(CPeer *peer)
// remove all clients from reflector client list // remove all clients from reflector client list
// it is double lock safe to lock Clients list after Peers list // it is double lock safe to lock Clients list after Peers list
CClients *clients = g_Reflector.GetClients(); CClients *clients = g_Reflector.GetClients();
for ( int i = 0; i < peer->GetNbClients(); i++ ) for ( auto cit=peer->begin(); cit!=peer->end(); cit++ )
{ {
// this also delete the client object // this also delete the client object
clients->RemoveClient(peer->GetClient(i)); clients->RemoveClient(*cit);
} }
// so clear it then // so clear it then
m_Peers[i]->ClearClients(); m_Peers[i]->ClearClients();
@ -227,4 +228,3 @@ CPeer *CPeers::FindNextPeer(int Protocol, int *index)
} }
return peer; return peer;
} }

@ -4,6 +4,7 @@
// //
// Created by Jean-Luc Deltombe (LX3JL) on 10/12/2016. // Created by Jean-Luc Deltombe (LX3JL) on 10/12/2016.
// Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved. // Copyright © 2016 Jean-Luc Deltombe (LX3JL). All rights reserved.
// Copyright © 2020 Thomas A. Early, N7TAE
// //
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// This file is part of xlxd. // This file is part of xlxd.
@ -57,15 +58,9 @@ CXlxPeer::CXlxPeer(const CCallsign &callsign, const CIp &ip, const char *modules
CXlxPeer::CXlxPeer(const CXlxPeer &peer) CXlxPeer::CXlxPeer(const CXlxPeer &peer)
: CPeer(peer) : CPeer(peer)
{ {
for ( int i = 0; i < peer.m_Clients.size(); i++ ) for ( auto it=peer.cbegin(); it!=peer.cend(); it++ )
{ {
CXlxClient *client = new CXlxClient((const CXlxClient &)*(peer.m_Clients[i])); CXlxClient *client = new CXlxClient((const CXlxClient &)*(*it));
// grow vector capacity if needed
if ( m_Clients.capacity() == m_Clients.size() )
{
m_Clients.reserve(m_Clients.capacity()+10);
}
// and append
m_Clients.push_back(client); m_Clients.push_back(client);
} }
@ -103,4 +98,3 @@ int CXlxPeer::GetProtocolRevision(const CVersion &version)
} }
return protrev; return protrev;
} }

Loading…
Cancel
Save

Powered by TurnKey Linux.