VirtualBox

Changeset 72547 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
Jun 13, 2018 3:50:39 PM (7 years ago)
Author:
vboxsync
Message:

HostDnsService: don't cache HostDnsInformation in the monitor.
Move polling of the extradata and lax comparison logic to the proxy.

Location:
trunk/src/VBox/Main/src-server
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-server/HostDnsService.cpp

    r72483 r72547  
    8181    Data(bool aThreaded)
    8282      : proxy(NULL),
    83         fThreaded(aThreaded),
    84         uLastExtraDataPoll(0),
    85         fLaxComparison(0)
     83        fThreaded(aThreaded)
    8684    {}
    8785
     
    9290    RTTHREAD hMonitoringThread;
    9391
     92    HostDnsInformation info;
     93};
     94
     95struct HostDnsMonitorProxy::Data
     96{
     97    Data(HostDnsMonitor *aMonitor, VirtualBox *aParent)
     98      : virtualbox(aParent),
     99        monitor(aMonitor),
     100        uLastExtraDataPoll(0),
     101        fLaxComparison(0),
     102        info()
     103    {}
     104
     105    VirtualBox *virtualbox;
     106    HostDnsMonitor *monitor;
     107
    94108    uint64_t uLastExtraDataPoll;
    95109    uint32_t fLaxComparison;
    96110    HostDnsInformation info;
    97 };
    98 
    99 struct HostDnsMonitorProxy::Data
    100 {
    101     Data(HostDnsMonitor *aMonitor, VirtualBox *aParent)
    102       : virtualbox(aParent),
    103         monitor(aMonitor),
    104         info(NULL)
    105     {}
    106 
    107     ~Data()
    108     {
    109         if (info)
    110         {
    111             delete info;
    112             info = NULL;
    113         }
    114     }
    115 
    116     VirtualBox *virtualbox;
    117     HostDnsMonitor *monitor;
    118     HostDnsInformation *info;
    119111};
    120112
     
    169161
    170162
    171 const HostDnsInformation &HostDnsMonitor::getInfo() const
    172 {
    173     return m->info;
    174 }
    175 
    176163void HostDnsMonitor::setInfo(const HostDnsInformation &info)
    177164{
    178     RTCLock grab(m_LockMtx);
    179 
    180     pollGlobalExtraData();
    181 
    182     if (info.equals(m->info))
    183         return;
    184 
    185     LogRel(("HostDnsMonitor: old information\n"));
    186     dumpHostDnsInformation(m->info);
    187     LogRel(("HostDnsMonitor: new information\n"));
    188     dumpHostDnsInformation(info);
    189 
    190     bool fIgnore = m->fLaxComparison && info.equals(m->info, m->fLaxComparison);
    191     m->info = info;
    192 
    193     if (fIgnore)
    194     {
    195         LogRel(("HostDnsMonitor: lax comparison %#x, not notifying\n", m->fLaxComparison));
    196         return;
    197     }
    198 
    199165    if (m->proxy != NULL)
    200         m->proxy->notify();
     166        m->proxy->notify(info);
    201167}
    202168
     
    204170{
    205171    m->proxy = proxy;
    206 
    207     pollGlobalExtraData();
    208172
    209173    if (m->fThreaded)
     
    223187
    224188
    225 void HostDnsMonitor::pollGlobalExtraData()
    226 {
    227     VirtualBox *virtualbox = m->proxy->getVirtualBox();
     189void HostDnsMonitorProxy::pollGlobalExtraData()
     190{
     191    VirtualBox *virtualbox = m->virtualbox;
    228192    if (RT_UNLIKELY(virtualbox == NULL))
    229193        return;
     
    314278    HostDnsMonitor *monitor = HostDnsMonitor::createHostDnsMonitor();
    315279    m = new HostDnsMonitorProxy::Data(monitor, aParent);
    316 
    317280    m->monitor->init(this);
    318     updateInfo();
    319 }
    320 
    321 
    322 VirtualBox *HostDnsMonitorProxy::getVirtualBox() const
    323 {
     281}
     282
     283
     284void HostDnsMonitorProxy::notify(const HostDnsInformation &info)
     285{
     286    bool fNotify = updateInfo(info);
     287    if (fNotify)
     288        m->virtualbox->i_onHostNameResolutionConfigurationChange();
     289}
     290
     291HRESULT HostDnsMonitorProxy::GetNameServers(std::vector<com::Utf8Str> &aNameServers)
     292{
     293    AssertReturn(m != NULL, E_FAIL);
    324294    RTCLock grab(m_LockMtx);
    325     return RT_LIKELY(m != NULL) ? m->virtualbox : NULL;
    326 }
    327 
    328 
    329 void HostDnsMonitorProxy::notify()
    330 {
    331     LogRel(("HostDnsMonitorProxy::notify\n"));
    332     updateInfo();
    333     m->virtualbox->i_onHostNameResolutionConfigurationChange();
    334 }
    335 
    336 HRESULT HostDnsMonitorProxy::GetNameServers(std::vector<com::Utf8Str> &aNameServers)
    337 {
    338     AssertReturn(m && m->info, E_FAIL);
     295
     296    LogRel(("HostDnsMonitorProxy::GetNameServers:\n"));
     297    dumpHostDnsStrVector("name server", m->info.servers);
     298
     299    detachVectorOfString(m->info.servers, aNameServers);
     300
     301    return S_OK;
     302}
     303
     304HRESULT HostDnsMonitorProxy::GetDomainName(com::Utf8Str *pDomainName)
     305{
     306    AssertReturn(m != NULL, E_FAIL);
    339307    RTCLock grab(m_LockMtx);
    340308
    341     LogRel(("HostDnsMonitorProxy::GetNameServers:\n"));
    342     dumpHostDnsStrVector("name server", m->info->servers);
    343 
    344     detachVectorOfString(m->info->servers, aNameServers);
     309    LogRel(("HostDnsMonitorProxy::GetDomainName: %s\n",
     310            m->info.domain.empty() ? "no domain set" : m->info.domain.c_str()));
     311
     312    *pDomainName = m->info.domain.c_str();
    345313
    346314    return S_OK;
    347315}
    348316
    349 HRESULT HostDnsMonitorProxy::GetDomainName(com::Utf8Str *pDomainName)
    350 {
    351     AssertReturn(m && m->info, E_FAIL);
     317HRESULT HostDnsMonitorProxy::GetSearchStrings(std::vector<com::Utf8Str> &aSearchStrings)
     318{
     319    AssertReturn(m != NULL, E_FAIL);
    352320    RTCLock grab(m_LockMtx);
    353321
    354     LogRel(("HostDnsMonitorProxy::GetDomainName: %s\n",
    355             m->info->domain.empty() ? "no domain set" : m->info->domain.c_str()));
    356 
    357     *pDomainName = m->info->domain.c_str();
     322    LogRel(("HostDnsMonitorProxy::GetSearchStrings:\n"));
     323    dumpHostDnsStrVector("search string", m->info.searchList);
     324
     325    detachVectorOfString(m->info.searchList, aSearchStrings);
    358326
    359327    return S_OK;
    360328}
    361329
    362 HRESULT HostDnsMonitorProxy::GetSearchStrings(std::vector<com::Utf8Str> &aSearchStrings)
    363 {
    364     AssertReturn(m && m->info, E_FAIL);
     330bool HostDnsMonitorProxy::updateInfo(const HostDnsInformation &info)
     331{
     332    LogRel(("HostDnsMonitor::updateInfo\n"));
    365333    RTCLock grab(m_LockMtx);
    366334
    367     LogRel(("HostDnsMonitorProxy::GetSearchStrings:\n"));
    368     dumpHostDnsStrVector("search string", m->info->searchList);
    369 
    370     detachVectorOfString(m->info->searchList, aSearchStrings);
    371 
    372     return S_OK;
    373 }
    374 
    375 void HostDnsMonitorProxy::updateInfo()
    376 {
    377     RTCLock grab(m_LockMtx);
    378 
    379     HostDnsInformation *info = new HostDnsInformation(m->monitor->getInfo());
    380     HostDnsInformation *old = m->info;
    381 
     335    if (info.equals(m->info))
     336    {
     337        LogRel(("HostDnsMonitor: unchanged\n"));
     338        return false;
     339    }
     340
     341    pollGlobalExtraData();
     342
     343    LogRel(("HostDnsMonitor: old information\n"));
     344    dumpHostDnsInformation(m->info);
     345    LogRel(("HostDnsMonitor: new information\n"));
     346    dumpHostDnsInformation(info);
     347
     348    bool fIgnore = m->fLaxComparison != 0 && info.equals(m->info, m->fLaxComparison);
    382349    m->info = info;
    383     if (old)
    384     {
    385         delete old;
    386     }
     350
     351    if (fIgnore)
     352    {
     353        LogRel(("HostDnsMonitor: lax comparison %#x, not notifying\n", m->fLaxComparison));
     354        return false;
     355    }
     356
     357    return true;
    387358}
    388359
  • trunk/src/VBox/Main/src-server/HostDnsService.h

    r72483 r72547  
    6262    virtual HRESULT init(HostDnsMonitorProxy *proxy);
    6363
    64     const HostDnsInformation &getInfo() const;
    65 
    6664  protected:
    6765    explicit HostDnsMonitor(bool fThreaded = false);
     
    7775  private:
    7876    static DECLCALLBACK(int) threadMonitoringRoutine(RTTHREAD, void *);
    79     void pollGlobalExtraData();
    8077
    8178  protected:
     
    9693    ~HostDnsMonitorProxy();
    9794    void init(VirtualBox *virtualbox);
    98     void notify();
    99 
    100     VirtualBox *getVirtualBox() const;
     95    void notify(const HostDnsInformation &info);
    10196
    10297    HRESULT GetNameServers(std::vector<com::Utf8Str> &aNameServers);
     
    10499    HRESULT GetSearchStrings(std::vector<com::Utf8Str> &aSearchStrings);
    105100
    106     private:
    107     void updateInfo();
     101  private:
     102    void pollGlobalExtraData();
     103    bool updateInfo(const HostDnsInformation &info);
    108104
    109105  private:
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette