TileControllerMemoryHandlerIOS.cpp [plain text]
#include "config.h"
#include "TileControllerMemoryHandlerIOS.h"
#include "MemoryPressureHandler.h"
#include "TileController.h"
namespace WebCore {
static const unsigned kMaxCountOfUnparentedTiledLayers = 16;
void TileControllerMemoryHandler::removeTileController(TileController* controller)
{
if (m_tileControllers.contains(controller))
m_tileControllers.remove(controller);
}
unsigned TileControllerMemoryHandler::totalUnparentedTiledLayers() const
{
unsigned totalUnparentedLayers = 0;
for (ListHashSet<TileController*>::const_iterator it = m_tileControllers.begin(); it != m_tileControllers.end(); ++it) {
TileController* tileController = *it;
totalUnparentedLayers += tileController->numberOfUnparentedTiles();
}
return totalUnparentedLayers;
}
void TileControllerMemoryHandler::tileControllerGainedUnparentedTiles(TileController* controller)
{
m_tileControllers.appendOrMoveToLast(controller);
if (memoryPressureHandler().isUnderMemoryPressure()) {
trimUnparentedTilesToTarget(0);
return;
}
if (totalUnparentedTiledLayers() < kMaxCountOfUnparentedTiledLayers)
return;
trimUnparentedTilesToTarget(kMaxCountOfUnparentedTiledLayers);
}
void TileControllerMemoryHandler::trimUnparentedTilesToTarget(int target)
{
while (!m_tileControllers.isEmpty()) {
TileController* tileController = m_tileControllers.first();
tileController->removeUnparentedTilesNow();
m_tileControllers.removeFirst();
if (target > 0 && totalUnparentedTiledLayers() < static_cast<unsigned>(target))
return;
}
}
TileControllerMemoryHandler& tileControllerMemoryHandler()
{
DEPRECATED_DEFINE_STATIC_LOCAL(TileControllerMemoryHandler, staticTileControllerMemoryHandler, ());
return staticTileControllerMemoryHandler;
}
}