| OLD | NEW |
| 1 /* | 1 /* |
| 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) | 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) |
| 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) | 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) |
| 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) | 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) |
| 5 Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | 5 Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. |
| 6 | 6 |
| 7 This library is free software; you can redistribute it and/or | 7 This library is free software; you can redistribute it and/or |
| 8 modify it under the terms of the GNU Library General Public | 8 modify it under the terms of the GNU Library General Public |
| 9 License as published by the Free Software Foundation; either | 9 License as published by the Free Software Foundation; either |
| 10 version 2 of the License, or (at your option) any later version. | 10 version 2 of the License, or (at your option) any later version. |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 { | 320 { |
| 321 unsigned accessCount = std::max(entry->m_resource->accessCount(), 1U); | 321 unsigned accessCount = std::max(entry->m_resource->accessCount(), 1U); |
| 322 unsigned queueIndex = WTF::fastLog2(entry->m_resource->size() / accessCount)
; | 322 unsigned queueIndex = WTF::fastLog2(entry->m_resource->size() / accessCount)
; |
| 323 if (m_allResources.size() <= queueIndex) | 323 if (m_allResources.size() <= queueIndex) |
| 324 m_allResources.grow(queueIndex + 1); | 324 m_allResources.grow(queueIndex + 1); |
| 325 return &m_allResources[queueIndex]; | 325 return &m_allResources[queueIndex]; |
| 326 } | 326 } |
| 327 | 327 |
| 328 void MemoryCache::removeFromLRUList(Resource* resource) | 328 void MemoryCache::removeFromLRUList(Resource* resource) |
| 329 { | 329 { |
| 330 // If we've never been accessed, then we're brand new and not in any list. | |
| 331 if (!resource->accessCount()) | |
| 332 return; | |
| 333 | |
| 334 MemoryCacheEntry* entry = m_resources.get(resource->url()); | 330 MemoryCacheEntry* entry = m_resources.get(resource->url()); |
| 335 ASSERT(entry->m_resource == resource); | 331 ASSERT(entry->m_resource == resource); |
| 332 |
| 336 LRUList* list = lruListFor(entry); | 333 LRUList* list = lruListFor(entry); |
| 334 MemoryCacheEntry* next = entry->m_nextInAllResourcesList; |
| 335 MemoryCacheEntry* previous = entry->m_previousInAllResourcesList; |
| 336 if (!next && !previous && list->m_head != entry) |
| 337 return; |
| 337 | 338 |
| 338 #if !ASSERT_DISABLED | 339 #if !ASSERT_DISABLED |
| 339 // Verify that we are in fact in this list. | 340 // Verify that we are in fact in this list. |
| 340 bool found = false; | 341 bool found = false; |
| 341 for (MemoryCacheEntry* current = list->m_head; current; current = current->m
_nextInAllResourcesList) { | 342 for (MemoryCacheEntry* current = list->m_head; current; current = current->m
_nextInAllResourcesList) { |
| 342 if (current == entry) { | 343 if (current == entry) { |
| 343 found = true; | 344 found = true; |
| 344 break; | 345 break; |
| 345 } | 346 } |
| 346 } | 347 } |
| 347 ASSERT(found); | 348 ASSERT(found); |
| 348 #endif | 349 #endif |
| 349 | 350 |
| 350 MemoryCacheEntry* next = entry->m_nextInAllResourcesList; | |
| 351 MemoryCacheEntry* previous = entry->m_previousInAllResourcesList; | |
| 352 | |
| 353 entry->m_nextInAllResourcesList = 0; | 351 entry->m_nextInAllResourcesList = 0; |
| 354 entry->m_previousInAllResourcesList = 0; | 352 entry->m_previousInAllResourcesList = 0; |
| 355 | 353 |
| 356 if (next) | 354 if (next) |
| 357 next->m_previousInAllResourcesList = previous; | 355 next->m_previousInAllResourcesList = previous; |
| 358 else | 356 else |
| 359 list->m_tail = previous; | 357 list->m_tail = previous; |
| 360 | 358 |
| 361 if (previous) | 359 if (previous) |
| 362 previous->m_nextInAllResourcesList = next; | 360 previous->m_nextInAllResourcesList = next; |
| 363 else | 361 else |
| 364 list->m_head = next; | 362 list->m_head = next; |
| 365 } | 363 } |
| 366 | 364 |
| 367 void MemoryCache::insertInLRUList(Resource* resource) | 365 void MemoryCache::insertInLRUList(Resource* resource) |
| 368 { | 366 { |
| 369 MemoryCacheEntry* entry = m_resources.get(resource->url()); | 367 MemoryCacheEntry* entry = m_resources.get(resource->url()); |
| 370 ASSERT(entry->m_resource == resource); | 368 ASSERT(entry->m_resource == resource); |
| 371 | 369 |
| 372 // Make sure we aren't in some list already. | 370 // Make sure we aren't in some list already. |
| 373 ASSERT(!entry->m_nextInAllResourcesList && !entry->m_previousInAllResourcesL
ist); | 371 ASSERT(!entry->m_nextInAllResourcesList && !entry->m_previousInAllResourcesL
ist); |
| 374 ASSERT(resource->inCache()); | 372 ASSERT(resource->inCache()); |
| 375 ASSERT(resource->accessCount() > 0); | |
| 376 | 373 |
| 377 LRUList* list = lruListFor(entry); | 374 LRUList* list = lruListFor(entry); |
| 378 | 375 |
| 379 entry->m_nextInAllResourcesList = list->m_head; | 376 entry->m_nextInAllResourcesList = list->m_head; |
| 380 if (list->m_head) | 377 if (list->m_head) |
| 381 list->m_head->m_previousInAllResourcesList = entry; | 378 list->m_head->m_previousInAllResourcesList = entry; |
| 382 list->m_head = entry; | 379 list->m_head = entry; |
| 383 | 380 |
| 384 if (!entry->m_nextInAllResourcesList) | 381 if (!entry->m_nextInAllResourcesList) |
| 385 list->m_tail = entry; | 382 list->m_tail = entry; |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 682 printf("(%.1fK, %.1fK, %uA, %dR, %d, %d); ", current->decodedSiz
e() / 1024.0f, (current->encodedSize() + current->overheadSize()) / 1024.0f, cur
rent->accessCount(), current->hasClients(), current->isPurgeable(), current->was
Purged()); | 679 printf("(%.1fK, %.1fK, %uA, %dR, %d, %d); ", current->decodedSiz
e() / 1024.0f, (current->encodedSize() + current->overheadSize()) / 1024.0f, cur
rent->accessCount(), current->hasClients(), current->isPurgeable(), current->was
Purged()); |
| 683 | 680 |
| 684 current = prev; | 681 current = prev; |
| 685 } | 682 } |
| 686 } | 683 } |
| 687 } | 684 } |
| 688 | 685 |
| 689 #endif // MEMORY_CACHE_STATS | 686 #endif // MEMORY_CACHE_STATS |
| 690 | 687 |
| 691 } // namespace WebCore | 688 } // namespace WebCore |
| OLD | NEW |