| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkGlyphCache.h" | 8 #include "SkGlyphCache.h" |
| 9 #include "SkGlyphCache_Globals.h" | 9 #include "SkGlyphCache_Globals.h" |
| 10 #include "SkGraphics.h" | 10 #include "SkGraphics.h" |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 463 rec->fProc(rec->fData); | 463 rec->fProc(rec->fData); |
| 464 AuxProcRec* next = rec->fNext; | 464 AuxProcRec* next = rec->fNext; |
| 465 delete rec; | 465 delete rec; |
| 466 rec = next; | 466 rec = next; |
| 467 } | 467 } |
| 468 } | 468 } |
| 469 | 469 |
| 470 /////////////////////////////////////////////////////////////////////////////// | 470 /////////////////////////////////////////////////////////////////////////////// |
| 471 /////////////////////////////////////////////////////////////////////////////// | 471 /////////////////////////////////////////////////////////////////////////////// |
| 472 | 472 |
| 473 typedef SkAutoTExclusive<SkSpinlock> Exclusive; | |
| 474 | |
| 475 size_t SkGlyphCache_Globals::setCacheSizeLimit(size_t newLimit) { | 473 size_t SkGlyphCache_Globals::setCacheSizeLimit(size_t newLimit) { |
| 476 static const size_t minLimit = 256 * 1024; | 474 static const size_t minLimit = 256 * 1024; |
| 477 if (newLimit < minLimit) { | 475 if (newLimit < minLimit) { |
| 478 newLimit = minLimit; | 476 newLimit = minLimit; |
| 479 } | 477 } |
| 480 | 478 |
| 481 Exclusive ac(fLock); | 479 SkAutoExclusive ac(fLock); |
| 482 | 480 |
| 483 size_t prevLimit = fCacheSizeLimit; | 481 size_t prevLimit = fCacheSizeLimit; |
| 484 fCacheSizeLimit = newLimit; | 482 fCacheSizeLimit = newLimit; |
| 485 this->internalPurge(); | 483 this->internalPurge(); |
| 486 return prevLimit; | 484 return prevLimit; |
| 487 } | 485 } |
| 488 | 486 |
| 489 int SkGlyphCache_Globals::setCacheCountLimit(int newCount) { | 487 int SkGlyphCache_Globals::setCacheCountLimit(int newCount) { |
| 490 if (newCount < 0) { | 488 if (newCount < 0) { |
| 491 newCount = 0; | 489 newCount = 0; |
| 492 } | 490 } |
| 493 | 491 |
| 494 Exclusive ac(fLock); | 492 SkAutoExclusive ac(fLock); |
| 495 | 493 |
| 496 int prevCount = fCacheCountLimit; | 494 int prevCount = fCacheCountLimit; |
| 497 fCacheCountLimit = newCount; | 495 fCacheCountLimit = newCount; |
| 498 this->internalPurge(); | 496 this->internalPurge(); |
| 499 return prevCount; | 497 return prevCount; |
| 500 } | 498 } |
| 501 | 499 |
| 502 void SkGlyphCache_Globals::purgeAll() { | 500 void SkGlyphCache_Globals::purgeAll() { |
| 503 Exclusive ac(fLock); | 501 SkAutoExclusive ac(fLock); |
| 504 this->internalPurge(fTotalMemoryUsed); | 502 this->internalPurge(fTotalMemoryUsed); |
| 505 } | 503 } |
| 506 | 504 |
| 507 /* This guy calls the visitor from within the mutext lock, so the visitor | 505 /* This guy calls the visitor from within the mutext lock, so the visitor |
| 508 cannot: | 506 cannot: |
| 509 - take too much time | 507 - take too much time |
| 510 - try to acquire the mutext again | 508 - try to acquire the mutext again |
| 511 - call a fontscaler (which might call into the cache) | 509 - call a fontscaler (which might call into the cache) |
| 512 */ | 510 */ |
| 513 SkGlyphCache* SkGlyphCache::VisitCache(SkTypeface* typeface, | 511 SkGlyphCache* SkGlyphCache::VisitCache(SkTypeface* typeface, |
| (...skipping 13 matching lines...) Expand all Loading... |
| 527 desc->findEntry(kRec_SkDescriptorTag, &length)); | 525 desc->findEntry(kRec_SkDescriptorTag, &length)); |
| 528 SkASSERT(rec); | 526 SkASSERT(rec); |
| 529 SkASSERT(length == sizeof(*rec)); | 527 SkASSERT(length == sizeof(*rec)); |
| 530 SkASSERT(typeface->uniqueID() == rec->fFontID); | 528 SkASSERT(typeface->uniqueID() == rec->fFontID); |
| 531 ) | 529 ) |
| 532 | 530 |
| 533 SkGlyphCache_Globals& globals = get_globals(); | 531 SkGlyphCache_Globals& globals = get_globals(); |
| 534 SkGlyphCache* cache; | 532 SkGlyphCache* cache; |
| 535 | 533 |
| 536 { | 534 { |
| 537 Exclusive ac(globals.fLock); | 535 SkAutoExclusive ac(globals.fLock); |
| 538 | 536 |
| 539 globals.validate(); | 537 globals.validate(); |
| 540 | 538 |
| 541 for (cache = globals.internalGetHead(); cache != nullptr; cache = cache-
>fNext) { | 539 for (cache = globals.internalGetHead(); cache != nullptr; cache = cache-
>fNext) { |
| 542 if (*cache->fDesc == *desc) { | 540 if (*cache->fDesc == *desc) { |
| 543 globals.internalDetachCache(cache); | 541 globals.internalDetachCache(cache); |
| 544 if (!proc(cache, context)) { | 542 if (!proc(cache, context)) { |
| 545 globals.internalAttachCacheToHead(cache); | 543 globals.internalAttachCacheToHead(cache); |
| 546 cache = nullptr; | 544 cache = nullptr; |
| 547 } | 545 } |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 if (dump->getRequestedDetails() == SkTraceMemoryDump::kLight_LevelOfDetail)
{ | 638 if (dump->getRequestedDetails() == SkTraceMemoryDump::kLight_LevelOfDetail)
{ |
| 641 dump->setMemoryBacking(gGlyphCacheDumpName, "malloc", nullptr); | 639 dump->setMemoryBacking(gGlyphCacheDumpName, "malloc", nullptr); |
| 642 return; | 640 return; |
| 643 } | 641 } |
| 644 | 642 |
| 645 SkGlyphCache::VisitAll(sk_trace_dump_visitor, dump); | 643 SkGlyphCache::VisitAll(sk_trace_dump_visitor, dump); |
| 646 } | 644 } |
| 647 | 645 |
| 648 void SkGlyphCache::VisitAll(Visitor visitor, void* context) { | 646 void SkGlyphCache::VisitAll(Visitor visitor, void* context) { |
| 649 SkGlyphCache_Globals& globals = get_globals(); | 647 SkGlyphCache_Globals& globals = get_globals(); |
| 650 Exclusive ac(globals.fLock); | 648 SkAutoExclusive ac(globals.fLock); |
| 651 SkGlyphCache* cache; | 649 SkGlyphCache* cache; |
| 652 | 650 |
| 653 globals.validate(); | 651 globals.validate(); |
| 654 | 652 |
| 655 for (cache = globals.internalGetHead(); cache != nullptr; cache = cache->fNe
xt) { | 653 for (cache = globals.internalGetHead(); cache != nullptr; cache = cache->fNe
xt) { |
| 656 visitor(*cache, context); | 654 visitor(*cache, context); |
| 657 } | 655 } |
| 658 } | 656 } |
| 659 | 657 |
| 660 /////////////////////////////////////////////////////////////////////////////// | 658 /////////////////////////////////////////////////////////////////////////////// |
| 661 | 659 |
| 662 void SkGlyphCache_Globals::attachCacheToHead(SkGlyphCache* cache) { | 660 void SkGlyphCache_Globals::attachCacheToHead(SkGlyphCache* cache) { |
| 663 Exclusive ac(fLock); | 661 SkAutoExclusive ac(fLock); |
| 664 | 662 |
| 665 this->validate(); | 663 this->validate(); |
| 666 cache->validate(); | 664 cache->validate(); |
| 667 | 665 |
| 668 this->internalAttachCacheToHead(cache); | 666 this->internalAttachCacheToHead(cache); |
| 669 this->internalPurge(); | 667 this->internalPurge(); |
| 670 } | 668 } |
| 671 | 669 |
| 672 SkGlyphCache* SkGlyphCache_Globals::internalGetTail() const { | 670 SkGlyphCache* SkGlyphCache_Globals::internalGetTail() const { |
| 673 SkGlyphCache* cache = fHead; | 671 SkGlyphCache* cache = fHead; |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 827 } | 825 } |
| 828 | 826 |
| 829 void SkGraphics::PurgeFontCache() { | 827 void SkGraphics::PurgeFontCache() { |
| 830 get_globals().purgeAll(); | 828 get_globals().purgeAll(); |
| 831 SkTypefaceCache::PurgeAll(); | 829 SkTypefaceCache::PurgeAll(); |
| 832 } | 830 } |
| 833 | 831 |
| 834 // TODO(herb): clean up TLS apis. | 832 // TODO(herb): clean up TLS apis. |
| 835 size_t SkGraphics::GetTLSFontCacheLimit() { return 0; } | 833 size_t SkGraphics::GetTLSFontCacheLimit() { return 0; } |
| 836 void SkGraphics::SetTLSFontCacheLimit(size_t bytes) { } | 834 void SkGraphics::SetTLSFontCacheLimit(size_t bytes) { } |
| OLD | NEW |