client fix init order leading to *NULL

Avoid a race between the main thread alloc of SimpleChannelSearchManagerImpl
the the UDP socket worker trying to use the same.

Split allocation and initialization of search manager
around socket creation and worker start.

Also in-line initializeUDPTransport() to only call site.
This commit is contained in:
Michael Davidsaver
2018-03-28 13:21:46 -07:00
parent aec1c7c9d7
commit 1a100a0955
3 changed files with 34 additions and 52 deletions
+6 -14
View File
@@ -41,17 +41,9 @@ const int SimpleChannelSearchManagerImpl::MAX_FRAMES_AT_ONCE = 10;
const int SimpleChannelSearchManagerImpl::DELAY_BETWEEN_FRAMES_MS = 50;
SimpleChannelSearchManagerImpl::shared_pointer
SimpleChannelSearchManagerImpl::create(Context::shared_pointer const & context)
{
SimpleChannelSearchManagerImpl::shared_pointer thisPtr(new SimpleChannelSearchManagerImpl(context));
thisPtr->activate();
return thisPtr;
}
SimpleChannelSearchManagerImpl::SimpleChannelSearchManagerImpl(Context::shared_pointer const & context) :
m_context(context),
m_responseAddress(context->getSearchTransport()->getRemoteAddress()),
m_responseAddress(), // initialized in activate()
m_canceled(),
m_sequenceNumber(0),
m_sendBuffer(MAX_UDP_UNFRAGMENTED_SEND),
@@ -62,17 +54,17 @@ SimpleChannelSearchManagerImpl::SimpleChannelSearchManagerImpl(Context::shared_p
m_userValueMutex(),
m_mutex()
{
// initialize send buffer
initializeSendBuffer();
// initialize random seed with some random value
srand ( time(NULL) );
}
void SimpleChannelSearchManagerImpl::activate()
{
m_responseAddress = Context::shared_pointer(m_context)->getSearchTransport()->getRemoteAddress();
// initialize send buffer
initializeSendBuffer();
// add some jitter so that all the clients do not send at the same time
double period = ATOMIC_PERIOD + (rand() % (2*PERIOD_JITTER_MS+1) - PERIOD_JITTER_MS)/(double)1000;