VirtualBox

Changeset 12418 in vbox for trunk


Ignore:
Timestamp:
Sep 12, 2008 11:47:28 AM (16 years ago)
Author:
vboxsync
Message:

Main/PerformanceWin: Fixed incorrect getObject behavior. The code seems to have been changed to query the number objects first, leaving old comments and snippets of silly code behind. It also attempted to delete a stack variable (objArray) in a failure case.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/win/PerformanceWin.cpp

    r12400 r12418  
    9999
    100100    if (SUCCEEDED (hr = CoCreateInstance(
    101         CLSID_WbemLocator, 
     101        CLSID_WbemLocator,
    102102        NULL,
    103103        CLSCTX_INPROC_SERVER,
     
    132132        NULL,
    133133        CLSCTX_INPROC_SERVER,
    134         IID_IWbemRefresher, 
     134        IID_IWbemRefresher,
    135135        (void**) &mRefresher)))
    136136    {
     
    141141            // Add an enumerator to the refresher.
    142142            if (SUCCEEDED (hr = pConfig->AddEnum(
    143                 mNameSpace, 
    144                 L"Win32_PerfRawData_PerfOS_Processor", 
    145                 0, 
    146                 NULL, 
    147                 &mEnumProcessor, 
     143                mNameSpace,
     144                L"Win32_PerfRawData_PerfOS_Processor",
     145                0,
     146                NULL,
     147                &mEnumProcessor,
    148148                &mEnumProcessorID)))
    149149            {
    150150                hr = pConfig->AddEnum(
    151151                    mNameSpace,
    152                     L"Win32_PerfRawData_PerfProc_Process", 
    153                     0, 
    154                     NULL, 
    155                     &mEnumProcess, 
     152                    L"Win32_PerfRawData_PerfProc_Process",
     153                    0,
     154                    NULL,
     155                    &mEnumProcess,
    156156                    &mEnumProcessID);
    157157            }
     
    239239int CollectorWin::getObjects(IWbemHiPerfEnum *mEnum, IWbemObjectAccess ***objArray, DWORD *numReturned)
    240240{
    241     HRESULT hr;
    242     DWORD   dwNumObjects = 0;
    243 
     241    /*
     242     * Get the number of objects.
     243     * Note that the caller ASSUMES that at least one object is returned, so fail if there are none.
     244     */
    244245    *objArray    = NULL;
    245246    *numReturned = 0;
    246     hr = mEnum->GetObjects(0L, dwNumObjects, *objArray, numReturned);
    247 
    248     // If the buffer was not big enough,
    249     // allocate a bigger buffer and retry.
    250     if (hr == WBEM_E_BUFFER_TOO_SMALL
    251         && *numReturned > dwNumObjects)
    252     {
    253         *objArray = new IWbemObjectAccess*[*numReturned];
    254         if (NULL == *objArray)
    255         {
    256             Log (("Could not allocate enumerator access objects\n"));
    257             return VERR_NO_MEMORY;
    258         }
    259 
    260         SecureZeroMemory(*objArray,
    261             *numReturned*sizeof(IWbemObjectAccess*));
    262         dwNumObjects = *numReturned;
    263 
    264         if (FAILED (hr = mEnum->GetObjects(0L,
    265             dwNumObjects, *objArray, numReturned)))
    266         {
    267             delete [] objArray;
    268             Log (("Failed to get objects from enumerator. HR = %x\n", hr));
    269             return VERR_INTERNAL_ERROR;
    270         }
    271     }
    272     else if (FAILED (hr))
    273     {
    274         Log (("Failed to get objects from enumerator. HR = %x\n", hr));
     247    HRESULT hr = mEnum->GetObjects(0L, 0, *objArray, numReturned);
     248    if (hr != WBEM_E_BUFFER_TOO_SMALL)
     249    {
     250        Log (("Failed to get the object count from the enumerator. HR = %x *numReturned=%d\n", hr, *numReturned));
     251        return VERR_INTERNAL_ERROR;
     252    }
     253
     254    /*
     255     * Allocate an array with the right lenght and get the actual objects.
     256     */
     257    DWORD cObjects = *numReturned;
     258    *objArray = new IWbemObjectAccess*[cObjects];
     259    if (!*objArray)
     260    {
     261        Log (("Could not allocate enumerator access objects\n"));
     262        return VERR_NO_MEMORY;
     263    }
     264    SecureZeroMemory(*objArray, cObjects * sizeof(IWbemObjectAccess*));
     265    hr = mEnum->GetObjects(0L, cObjects, *objArray, numReturned);
     266    if (FAILED(hr) || *numReturned == 0)
     267    {
     268        delete [] *objArray;
     269        *objArray = NULL;
     270        Log (("Failed to get the objects from the enumerator. HR = %x *numReturned=%d cObjects=%d\n", hr, *numReturned, cObjects));
    275271        return VERR_INTERNAL_ERROR;
    276272    }
     
    466462{
    467463    MEMORYSTATUSEX mstat;
    468    
     464
    469465    mstat.dwLength = sizeof(mstat);
    470466    if (GlobalMemoryStatusEx(&mstat))
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