VirtualBox

Ignore:
Timestamp:
Feb 20, 2014 8:32:15 AM (11 years ago)
Author:
vboxsync
Message:

HGSMI memory allocator: saved state

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.cpp

    r50482 r50518  
    13271327}
    13281328
     1329static int hgsmiHostSaveMA(PSSMHANDLE pSSM, HGSMIMADATA *pMA)
     1330{
     1331    int rc = SSMR3PutU32(pSSM, pMA->cBlocks);
     1332    if (RT_SUCCESS(rc))
     1333    {
     1334        HGSMIMABLOCK *pIter;
     1335        RTListForEach(&pMA->listBlocks, pIter, HGSMIMABLOCK, nodeBlock)
     1336        {
     1337            SSMR3PutU32(pSSM, pIter->descriptor);
     1338        }
     1339
     1340        rc = SSMR3PutU32(pSSM, pMA->cbMaxBlock);
     1341    }
     1342
     1343    return rc;
     1344}
     1345
     1346static int hgsmiHostLoadMA(PSSMHANDLE pSSM, uint32_t *pcBlocks, HGSMIOFFSET **ppaDescriptors, HGSMISIZE *pcbMaxBlock)
     1347{
     1348    int rc = SSMR3GetU32(pSSM, pcBlocks);
     1349    if (RT_SUCCESS(rc))
     1350    {
     1351        HGSMIOFFSET *paDescriptors = NULL;
     1352        if (*pcBlocks > 0)
     1353        {
     1354            paDescriptors = (HGSMIOFFSET *)RTMemAlloc(*pcBlocks * sizeof(HGSMIOFFSET));
     1355            if (paDescriptors)
     1356            {
     1357                uint32_t i;
     1358                for (i = 0; i < *pcBlocks; ++i)
     1359                {
     1360                    SSMR3GetU32(pSSM, &paDescriptors[i]);
     1361                }
     1362            }
     1363            else
     1364            {
     1365                rc = VERR_NO_MEMORY;
     1366            }
     1367        }
     1368
     1369        if (RT_SUCCESS(rc))
     1370        {
     1371            rc = SSMR3GetU32(pSSM, pcbMaxBlock);
     1372        }
     1373
     1374        if (RT_SUCCESS(rc))
     1375        {
     1376            *ppaDescriptors = paDescriptors;
     1377        }
     1378        else
     1379        {
     1380            RTMemFree(paDescriptors);
     1381        }
     1382    }
     1383
     1384    return rc;
     1385}
     1386
    13291387int HGSMIHostSaveStateExec (PHGSMIINSTANCE pIns, PSSMHANDLE pSSM)
    13301388{
     
    13321390
    13331391    int rc;
     1392
     1393    SSMR3PutU32(pSSM, pIns->hostHeap.u32HeapType);
    13341394
    13351395    HGSMIOFFSET off = pIns->pHGFlags ? HGSMIPointerToOffset(&pIns->area, (const HGSMIBUFFERHEADER *)pIns->pHGFlags) : HGSMIOFFSET_VOID;
    13361396    SSMR3PutU32 (pSSM, off);
    13371397
    1338     off = HGSMIHeapHandleLocationOffset(&pIns->hostHeap);
     1398    off = pIns->hostHeap.u32HeapType == HGSMI_HEAP_TYPE_MA?
     1399              0:
     1400              HGSMIHeapHandleLocationOffset(&pIns->hostHeap);
    13391401    rc = SSMR3PutU32 (pSSM, off);
    13401402    if(off != HGSMIOFFSET_VOID)
     
    13561418            hgsmiFIFOUnlock (pIns);
    13571419        }
     1420
     1421        if (RT_SUCCESS(rc))
     1422        {
     1423            if (pIns->hostHeap.u32HeapType == HGSMI_HEAP_TYPE_MA)
     1424            {
     1425                rc = hgsmiHostSaveMA(pSSM, &pIns->hostHeap.u.ma);
     1426            }
     1427        }
    13581428    }
    13591429
     
    13721442    int rc;
    13731443    HGSMIOFFSET off;
     1444    uint32_t u32HeapType = HGSMI_HEAP_TYPE_NULL;
     1445
     1446    if (u32Version >= VGA_SAVEDSTATE_VERSION_HGSMIMA)
     1447    {
     1448        rc = SSMR3GetU32(pSSM, &u32HeapType);
     1449        AssertRCReturn(rc, rc);
     1450    }
     1451
    13741452    rc = SSMR3GetU32(pSSM, &off);
    13751453    AssertRCReturn(rc, rc);
     
    13811459    if(off != HGSMIOFFSET_VOID)
    13821460    {
     1461        /* There is a saved heap. */
     1462        if (u32HeapType == HGSMI_HEAP_TYPE_NULL)
     1463        {
     1464            u32HeapType = u32Version > VGA_SAVEDSTATE_VERSION_HOST_HEAP?
     1465                              HGSMI_HEAP_TYPE_OFFSET:
     1466                              HGSMI_HEAP_TYPE_POINTER;
     1467        }
     1468
    13831469        HGSMIOFFSET offHeap;
    13841470        SSMR3GetU32(pSSM, &offHeap);
     
    13881474        rc = SSMR3GetU64(pSSM, &oldMem);
    13891475        AssertRCReturn(rc, rc);
    1390 
    1391         rc = hgsmiHostHeapLock (pIns);
    1392         if (RT_SUCCESS (rc))
    1393         {
    1394             Assert(!pIns->hostHeap.cRefs);
    1395             pIns->hostHeap.cRefs = 0;
    1396 
    1397             rc = HGSMIHeapRelocate(&pIns->hostHeap,
    1398                                    u32Version > VGA_SAVEDSTATE_VERSION_HOST_HEAP?
    1399                                        HGSMI_HEAP_TYPE_OFFSET:
    1400                                        HGSMI_HEAP_TYPE_POINTER,
    1401                                    pIns->area.pu8Base+offHeap,
    1402                                    off,
    1403                                    uintptr_t(pIns->area.pu8Base) - uintptr_t(oldMem),
    1404                                    cbHeap,
    1405                                    offHeap,
    1406                                    &g_hgsmiEnv);
    1407 
    1408             hgsmiHostHeapUnlock (pIns);
    1409         }
    14101476
    14111477        if (RT_SUCCESS(rc))
     
    14251491
    14261492                hgsmiFIFOUnlock (pIns);
     1493            }
     1494        }
     1495
     1496        if (RT_SUCCESS(rc))
     1497        {
     1498            if (u32HeapType == HGSMI_HEAP_TYPE_MA)
     1499            {
     1500                uint32_t cBlocks = 0;
     1501                HGSMISIZE cbMaxBlock = 0;
     1502                HGSMIOFFSET *paDescriptors = NULL;
     1503                rc = hgsmiHostLoadMA(pSSM, &cBlocks, &paDescriptors, &cbMaxBlock);
     1504                if (RT_SUCCESS(rc))
     1505                {
     1506                    rc = HGSMIHeapRestoreMA(&pIns->hostHeap,
     1507                                            pIns->area.pu8Base+offHeap,
     1508                                            cbHeap,
     1509                                            offHeap,
     1510                                            cBlocks,
     1511                                            paDescriptors,
     1512                                            cbMaxBlock,
     1513                                            &g_hgsmiEnv);
     1514
     1515                    RTMemFree(paDescriptors);
     1516                }
     1517            }
     1518            else if (   u32HeapType == HGSMI_HEAP_TYPE_OFFSET
     1519                     || u32HeapType == HGSMI_HEAP_TYPE_POINTER)
     1520            {
     1521                rc = hgsmiHostHeapLock (pIns);
     1522                if (RT_SUCCESS (rc))
     1523                {
     1524                    Assert(!pIns->hostHeap.cRefs);
     1525                    pIns->hostHeap.cRefs = 0;
     1526
     1527                    rc = HGSMIHeapRelocate(&pIns->hostHeap,
     1528                                           u32HeapType,
     1529                                           pIns->area.pu8Base+offHeap,
     1530                                           off,
     1531                                           uintptr_t(pIns->area.pu8Base) - uintptr_t(oldMem),
     1532                                           cbHeap,
     1533                                           offHeap);
     1534
     1535                    hgsmiHostHeapUnlock (pIns);
     1536                }
    14271537            }
    14281538        }
     
    17481858#endif
    17491859
     1860    HGSMIHeapDestroy(&pIns->hostHeap);
     1861
    17501862    HGSMIHeapSetupUninitialized(&pIns->hostHeap);
    17511863
     
    17591871    if (pIns)
    17601872    {
     1873        HGSMIHeapDestroy(&pIns->hostHeap);
     1874
    17611875        if (RTCritSectIsInitialized (&pIns->hostHeapCritSect))
    17621876        {
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