VirtualBox

Changeset 96540 in vbox


Ignore:
Timestamp:
Aug 28, 2022 4:40:20 PM (2 years ago)
Author:
vboxsync
Message:

VBox/com/microatl.h: Split up CComCritSectLock into one capable of automatically taking the lock in the constructore, and a base class CComCritSectLockManual requiring explicint locking. Since the code only needs the latter, we avoid a 'throw' that causes trouble in no-CRT mode where we have exceptions disabled. Also added a missing Lock() return code check in GetTI. bugref:10261

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/com/microatl.h

    r96407 r96540  
    185185};
    186186
    187 template <class TLock> class CComCritSectLock
    188 {
    189 public:
    190     CComCritSectLock(CComCriticalSection &cs, bool fInitialLock = true) :
    191         m_cs(cs),
    192         m_fLocked(false)
    193     {
    194         if (fInitialLock)
    195         {
    196             HRESULT hrc = Lock();
    197             if (FAILED(hrc))
    198                 throw hrc;
    199         }
    200     }
    201 
    202     ~CComCritSectLock() throw()
     187template<class TLock>
     188class CComCritSectLockManual
     189{
     190public:
     191    CComCritSectLockManual(CComCriticalSection &cs)
     192        : m_cs(cs)
     193        , m_fLocked(false)
     194    {
     195    }
     196
     197    ~CComCritSectLockManual() throw()
    203198    {
    204199        if (m_fLocked)
     
    228223    bool m_fLocked;
    229224
     225    CComCritSectLockManual(const CComCritSectLockManual&) throw(); // Do not call.
     226    CComCritSectLockManual &operator=(const CComCritSectLockManual &) throw(); // Do not call.
     227};
     228
     229
     230#ifdef RT_EXCEPTIONS_ENABLED
     231/** This is called CComCritSecLock in real ATL... */
     232template<class TLock>
     233class CComCritSectLock : public CComCritSectLockManual<TLock>
     234{
     235public:
     236    CComCritSectLock(CComCriticalSection &cs, bool fInitialLock = true)
     237        : CComCritSectLockManual(cs)
     238    {
     239        if (fInitialLock)
     240        {
     241            HRESULT hrc = Lock();
     242            if (FAILED(hrc))
     243                throw hrc;
     244        }
     245    }
     246
     247private:
    230248    CComCritSectLock(const CComCritSectLock&) throw(); // Do not call.
    231249    CComCritSectLock &operator=(const CComCritSectLock &) throw(); // Do not call.
    232250};
     251#endif
    233252
    234253class CComFakeCriticalSection
     
    420439        pNew->pfn = pfn;
    421440        pNew->pv = pv;
    422         CComCritSectLock<CComCriticalSection> lock(m_csStaticDataInitAndTypeInfo, false);
     441        CComCritSectLockManual<CComCriticalSection> lock(m_csStaticDataInitAndTypeInfo);
    423442        HRESULT hrc = lock.Lock();
    424443        if (SUCCEEDED(hrc))
     
    576595                    if (!pEntry->pCF)
    577596                    {
    578                         CComCritSectLock<CComCriticalSection> lock(_AtlComModule.m_csObjMap, false);
     597                        CComCritSectLockManual<CComCriticalSection> lock(_AtlComModule.m_csObjMap);
    579598                        hrc = lock.Lock();
    580599                        if (FAILED(hrc))
     
    848867        if (m_pTInfo)
    849868            return S_OK;
    850         CComCritSectLock<CComCriticalSection> lock(_pAtlModule->m_csStaticDataInitAndTypeInfo, false);
     869
     870        CComCritSectLockManual<CComCriticalSection> lock(_pAtlModule->m_csStaticDataInitAndTypeInfo);
    851871        HRESULT hrc = lock.Lock();
    852         ITypeLib *pTypeLib = NULL;
    853         Assert(*m_pLibID != GUID_NULL);
    854         hrc = LoadRegTypeLib(*m_pLibID, m_iMajor, m_iMinor, lcid, &pTypeLib);
    855872        if (SUCCEEDED(hrc))
    856873        {
    857             ITypeInfo *pTypeInfo;
    858             hrc = pTypeLib->GetTypeInfoOfGuid(*m_pGUID, &pTypeInfo);
     874            ITypeLib *pTypeLib = NULL;
     875            Assert(*m_pLibID != GUID_NULL);
     876            hrc = LoadRegTypeLib(*m_pLibID, m_iMajor, m_iMinor, lcid, &pTypeLib);
    859877            if (SUCCEEDED(hrc))
    860878            {
    861                 ITypeInfo2 *pTypeInfo2;
    862                 if (SUCCEEDED(pTypeInfo->QueryInterface(__uuidof(ITypeInfo2), (void **)&pTypeInfo2)))
     879                ITypeInfo *pTypeInfo;
     880                hrc = pTypeLib->GetTypeInfoOfGuid(*m_pGUID, &pTypeInfo);
     881                if (SUCCEEDED(hrc))
    863882                {
    864                     pTypeInfo->Release();
    865                     pTypeInfo = pTypeInfo2;
     883                    ITypeInfo2 *pTypeInfo2;
     884                    if (SUCCEEDED(pTypeInfo->QueryInterface(__uuidof(ITypeInfo2), (void **)&pTypeInfo2)))
     885                    {
     886                        pTypeInfo->Release();
     887                        pTypeInfo = pTypeInfo2;
     888                    }
     889                    m_pTInfo = pTypeInfo;
     890                    _pAtlModule->AddTermFunc(Cleanup, (void *)this);
    866891                }
    867                 m_pTInfo = pTypeInfo;
    868                 _pAtlModule->AddTermFunc(Cleanup, (void *)this);
     892                pTypeLib->Release();
    869893            }
    870             pTypeLib->Release();
    871894        }
    872895        return hrc;
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