void Logger::settingThread()

in common/logger.cpp [192:262]


void Logger::settingThread()
{
    Select select;
    DBConnector db("CONFIG_DB", 0);
    std::map<std::string, std::shared_ptr<SubscriberStateTable>> selectables;
    auto table = std::make_shared<SubscriberStateTable>(&db, CFG_LOGGER_TABLE_NAME);
    selectables.emplace(CFG_LOGGER_TABLE_NAME, table);
    select.addSelectable(table.get());
    select.addSelectable(m_stopEvent.get());

    while (1)
    {

        Selectable *selectable = nullptr;

        /* TODO Resolve latency caused by timeout at initialization. */
        int ret = select.select(&selectable, 1000); // Timeout if there is no data in 1000 ms.

        if (ret == Select::ERROR)
        {
            SWSS_LOG_NOTICE("%s select error %s", __PRETTY_FUNCTION__, strerror(errno));
            continue;
        }

        if (ret == Select::TIMEOUT)
        {
            SWSS_LOG_DEBUG("%s select timeout", __PRETTY_FUNCTION__);
            continue;
        }

        if (selectable == m_stopEvent.get())
        {
            break;
        }

        KeyOpFieldsValuesTuple koValues;
        SubscriberStateTable *subscriberStateTable = NULL;
        subscriberStateTable = dynamic_cast<SubscriberStateTable *>(selectable);
        if (subscriberStateTable == NULL)
        {
            SWSS_LOG_ERROR("dynamic_cast returned NULL");
            break;
        }
        subscriberStateTable->pop(koValues);
        std::string key = kfvKey(koValues), op = kfvOp(koValues);

        if (op != SET_COMMAND || !m_settingChangeObservers.contains(key))
        {
            continue;
        }

        const auto& values = kfvFieldsValues(koValues);

        for (auto& i : values)
        {
            auto& field = fvField(i);
            auto& value = fvValue(i);

            if ((field == DAEMON_LOGLEVEL) && (value != m_currentPrios.get(key)))
            {
                m_currentPrios.set(key, value);
                m_settingChangeObservers.get(key).first(key, value);
            }
            else if ((field == DAEMON_LOGOUTPUT) && (value != m_currentOutputs.get(key)))
            {
                m_currentOutputs.set(key, value);
                m_settingChangeObservers.get(key).second(key, value);
            }
        }
    }
}