bool LoaderManager::remove()

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;
}