|
|
|
@ -114,7 +114,7 @@ bool CReflector::Start(void)
|
|
|
|
// start one thread per reflector module
|
|
|
|
// start one thread per reflector module
|
|
|
|
for ( int i = 0; i < NB_OF_MODULES; i++ )
|
|
|
|
for ( int i = 0; i < NB_OF_MODULES; i++ )
|
|
|
|
{
|
|
|
|
{
|
|
|
|
m_RouterFuture[i] = std::async(std::launch::async, &CReflector::RouterThread, this, &(m_Streams[i]));
|
|
|
|
m_RouterFuture[i] = std::async(std::launch::async, &CReflector::RouterThread, this, &(m_Stream[i]));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// start the reporting threads
|
|
|
|
// start the reporting threads
|
|
|
|
@ -241,11 +241,9 @@ CPacketStream *CReflector::OpenStream(CDvHeaderPacket *DvHeader, std::shared_ptr
|
|
|
|
|
|
|
|
|
|
|
|
void CReflector::CloseStream(CPacketStream *stream)
|
|
|
|
void CReflector::CloseStream(CPacketStream *stream)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//
|
|
|
|
|
|
|
|
if ( stream != nullptr )
|
|
|
|
if ( stream != nullptr )
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// wait queue is empty
|
|
|
|
// wait queue is empty. this waits forever
|
|
|
|
// this waits forever
|
|
|
|
|
|
|
|
bool bEmpty = false;
|
|
|
|
bool bEmpty = false;
|
|
|
|
do
|
|
|
|
do
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@ -256,18 +254,12 @@ void CReflector::CloseStream(CPacketStream *stream)
|
|
|
|
bEmpty = stream->empty();
|
|
|
|
bEmpty = stream->empty();
|
|
|
|
stream->Unlock();
|
|
|
|
stream->Unlock();
|
|
|
|
if ( !bEmpty )
|
|
|
|
if ( !bEmpty )
|
|
|
|
{
|
|
|
|
|
|
|
|
// wait a bit
|
|
|
|
|
|
|
|
CTimePoint::TaskSleepFor(10);
|
|
|
|
CTimePoint::TaskSleepFor(10);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
while (!bEmpty);
|
|
|
|
while (!bEmpty);
|
|
|
|
|
|
|
|
|
|
|
|
// lock clients
|
|
|
|
GetClients(); // lock clients
|
|
|
|
GetClients();
|
|
|
|
stream->Lock(); // lock stream
|
|
|
|
|
|
|
|
|
|
|
|
// lock stream
|
|
|
|
|
|
|
|
stream->Lock();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// get and check the master
|
|
|
|
// get and check the master
|
|
|
|
std::shared_ptr<CClient>client = stream->GetOwnerClient();
|
|
|
|
std::shared_ptr<CClient>client = stream->GetOwnerClient();
|
|
|
|
@ -277,7 +269,7 @@ void CReflector::CloseStream(CPacketStream *stream)
|
|
|
|
client->NotAMaster();
|
|
|
|
client->NotAMaster();
|
|
|
|
|
|
|
|
|
|
|
|
// notify
|
|
|
|
// notify
|
|
|
|
g_Reflector.OnStreamClose(stream->GetUserCallsign());
|
|
|
|
OnStreamClose(stream->GetUserCallsign());
|
|
|
|
|
|
|
|
|
|
|
|
std::cout << "Closing stream of module " << GetStreamModule(stream) << std::endl;
|
|
|
|
std::cout << "Closing stream of module " << GetStreamModule(stream) << std::endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -292,8 +284,6 @@ void CReflector::CloseStream(CPacketStream *stream)
|
|
|
|
|
|
|
|
|
|
|
|
// and stop the queue
|
|
|
|
// and stop the queue
|
|
|
|
stream->Close();
|
|
|
|
stream->Close();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -552,37 +542,32 @@ int CReflector::GetModuleIndex(char module) const
|
|
|
|
|
|
|
|
|
|
|
|
CPacketStream *CReflector::GetStream(char module)
|
|
|
|
CPacketStream *CReflector::GetStream(char module)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
CPacketStream *stream = nullptr;
|
|
|
|
|
|
|
|
int i = GetModuleIndex(module);
|
|
|
|
int i = GetModuleIndex(module);
|
|
|
|
if ( i >= 0 )
|
|
|
|
if ( i >= 0 )
|
|
|
|
{
|
|
|
|
{
|
|
|
|
stream = &(m_Streams[i]);
|
|
|
|
return &(m_Stream[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return stream;
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CReflector::IsStreamOpen(const CDvHeaderPacket *DvHeader)
|
|
|
|
bool CReflector::IsStreamOpen(const CDvHeaderPacket *DvHeader)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
bool open = false;
|
|
|
|
for ( unsigned i = 0; i < m_Stream.size(); i++ )
|
|
|
|
for ( unsigned i = 0; (i < m_Streams.size()) && !open; i++ )
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
open = ( (m_Streams[i].GetStreamId() == DvHeader->GetStreamId()) &&
|
|
|
|
if ( (m_Stream[i].GetStreamId() == DvHeader->GetStreamId()) && (m_Stream[i].IsOpen()) )
|
|
|
|
(m_Streams[i].IsOpen()));
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return open;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
char CReflector::GetStreamModule(CPacketStream *stream)
|
|
|
|
char CReflector::GetStreamModule(CPacketStream *stream)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
char module = ' ';
|
|
|
|
for ( unsigned i = 0; i < m_Stream.size(); i++ )
|
|
|
|
for ( unsigned i = 0; (i < m_Streams.size()) && (module == ' '); i++ )
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if ( &(m_Streams[i]) == stream )
|
|
|
|
if ( &(m_Stream[i]) == stream )
|
|
|
|
{
|
|
|
|
return GetModuleLetter(i);
|
|
|
|
module = GetModuleLetter(i);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return module;
|
|
|
|
return ' ';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|