VirtualBox

Changeset 24529 in vbox


Ignore:
Timestamp:
Nov 9, 2009 11:16:22 PM (15 years ago)
Author:
vboxsync
Message:

AsyncCompletion: Fix reference leak of cached entries. Blocked further cache operations

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/PDMAsyncCompletionFileCache.cpp

    r24517 r24529  
    700700                   "/PDM/AsyncCompletion/File/CacheBuffersReused",
    701701                   STAMUNIT_COUNT, "Number of times a buffer could be reused");
     702    STAMR3Register(pClassFile->Core.pVM, &pCache->uAdaptVal,
     703                   STAMTYPE_U32, STAMVISIBILITY_ALWAYS,
     704                   "/PDM/AsyncCompletion/File/CacheAdaptValue",
     705                   STAMUNIT_COUNT,
     706                   "Adaption value of the cache");
    702707#endif
    703708
     
    12181223            else
    12191224            {
     1225                 if (pEntryBestFit)
     1226                    pdmacFileEpCacheEntryRelease(pEntryBestFit);
     1227
    12201228                /*
    12211229                 * Align the size to a 4KB boundary.
     
    14121420                    RTSemRWReleaseWrite(pEndpointCache->SemRWEntries);
    14131421                }
    1414                 else
     1422                else /* Deprecated flag not set */
    14151423                {
    14161424                    /* If the entry is dirty it must be also in progress now and we have to defer updating it again. */
     
    14521460                            STAM_COUNTER_INC(&pEndpointCache->StatWriteDeferred);
    14531461                        }
    1454                         else
     1462                        else /* Deprecate buffer */
    14551463                        {
    14561464                            LogFlow(("Deprecating buffer for entry %#p\n", pEntry));
     
    14921500                        RTSemRWReleaseWrite(pEndpointCache->SemRWEntries);
    14931501                    }
    1494                     else
     1502                    else /* Dirty bit not set */
    14951503                    {
    14961504                        /*
     
    15231531                            RTSemRWReleaseWrite(pEndpointCache->SemRWEntries);
    15241532                        }
    1525                         else
     1533                        else /* I/O in progres flag not set */
    15261534                        {
    15271535                            /* Write as much as we can into the entry and update the file. */
     
    15431551                            pdmacFileCacheWriteToEndpoint(pEntry);
    15441552                        }
    1545                     }
     1553                    } /* Dirty bit not set */
    15461554
    15471555                    /* Move this entry to the top position */
     
    15491557                    pdmacFileCacheEntryAddToList(&pCache->LruFrequentlyUsed, pEntry);
    15501558                    RTCritSectLeave(&pCache->CritSect);
    1551                 }
     1559                } /* Deprecated flag not set. */
    15521560            }
    1553             else
     1561            else /* Entry is on the ghost list */
    15541562            {
    15551563                uint8_t *pbBuffer = NULL;
     
    15991607            pdmacFileEpCacheEntryRelease(pEntry);
    16001608        }
    1601         else
     1609        else /* No entry found */
    16021610        {
    16031611            /*
     
    16201628            }
    16211629            else
     1630            {
     1631                if (pEntryBestFit)
     1632                    pdmacFileEpCacheEntryRelease(pEntryBestFit);
     1633
    16221634                cbToWrite = cbWrite;
     1635            }
    16231636
    16241637            cbWrite -= cbToWrite;
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