in src/dxapi/native/tickdb/loader_manager.cpp [76:134]
bool LoaderManager::remove(TickLoaderImpl * loader, bool waitForCompletion)
{
{ WRITE_LOCK
auto l = loaders_.find(loader);
if (NULL == l || being_removed_.find(l)) {
return false;
}
if (!waitForCompletion) {
//assert(!loader->dbgProcessingServerResponse_);
DBGLOG(LOGHDR ".removeLoader(%s) loaders_.remove(loader) start", ID, loader->textId());
loaders_.remove(loader);
DBGLOG(LOGHDR ".removeLoader(%s) loaders_.remove(loader) end", ID, loader->textId());
//assert(NULL == loaders_.find(loader));
return true;
}
// To avoid double removal
being_removed_.add(loader);
}
// We can get here only if waitForCompletion == true
assert(waitForCompletion);
try {
if (waitForCompletion) {
int remaining = loaderCloseTimeout_;
for (; remaining > 0; --remaining) {
if (loader->interruption_ > Interruption::STOPPING) {
DBGLOG(LOGHDR ".removeLoader(%s): waited until interruption flag", ID, loader->textId());
break;
}
this_thread::sleep_for(chrono::milliseconds(1));
}
if (remaining <= 0) {
DBGLOG(LOGHDR ".removeLoader(%s) Timeout! No proper response from the server.", ID, loader->textId());
}
}
{ WRITE_LOCK
being_removed_.remove(loader);
loaders_.remove(loader);
}
}
catch (...) {
DBGLOG(LOGHDR ".removeLoader(%s): Exception occured", ID, loader->textId());
{ WRITE_LOCK
being_removed_.remove(loader);
loaders_.remove(loader);
}
throw;
}
return true;
}