Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(499)

Side by Side Diff: src/core/SkGlyphCache.cpp

Issue 1424563002: Use SkAutoTExclusive. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 rec->fProc(rec->fData); 286 rec->fProc(rec->fData);
287 AuxProcRec* next = rec->fNext; 287 AuxProcRec* next = rec->fNext;
288 delete rec; 288 delete rec;
289 rec = next; 289 rec = next;
290 } 290 }
291 } 291 }
292 292
293 /////////////////////////////////////////////////////////////////////////////// 293 ///////////////////////////////////////////////////////////////////////////////
294 /////////////////////////////////////////////////////////////////////////////// 294 ///////////////////////////////////////////////////////////////////////////////
295 295
296 296 typedef SkAutoTExclusive<SkSpinlock> Exclusive;
297 class AutoAcquire {
298 public:
299 AutoAcquire(SkSpinlock& lock) : fLock(lock) { fLock.acquire(); }
300 ~AutoAcquire() { fLock.release(); }
301 private:
302 SkSpinlock& fLock;
303 };
304 297
305 size_t SkGlyphCache_Globals::setCacheSizeLimit(size_t newLimit) { 298 size_t SkGlyphCache_Globals::setCacheSizeLimit(size_t newLimit) {
306 static const size_t minLimit = 256 * 1024; 299 static const size_t minLimit = 256 * 1024;
307 if (newLimit < minLimit) { 300 if (newLimit < minLimit) {
308 newLimit = minLimit; 301 newLimit = minLimit;
309 } 302 }
310 303
311 AutoAcquire ac(fLock); 304 Exclusive ac(fLock);
312 305
313 size_t prevLimit = fCacheSizeLimit; 306 size_t prevLimit = fCacheSizeLimit;
314 fCacheSizeLimit = newLimit; 307 fCacheSizeLimit = newLimit;
315 this->internalPurge(); 308 this->internalPurge();
316 return prevLimit; 309 return prevLimit;
317 } 310 }
318 311
319 int SkGlyphCache_Globals::setCacheCountLimit(int newCount) { 312 int SkGlyphCache_Globals::setCacheCountLimit(int newCount) {
320 if (newCount < 0) { 313 if (newCount < 0) {
321 newCount = 0; 314 newCount = 0;
322 } 315 }
323 316
324 AutoAcquire ac(fLock); 317 Exclusive ac(fLock);
325 318
326 int prevCount = fCacheCountLimit; 319 int prevCount = fCacheCountLimit;
327 fCacheCountLimit = newCount; 320 fCacheCountLimit = newCount;
328 this->internalPurge(); 321 this->internalPurge();
329 return prevCount; 322 return prevCount;
330 } 323 }
331 324
332 void SkGlyphCache_Globals::purgeAll() { 325 void SkGlyphCache_Globals::purgeAll() {
333 AutoAcquire ac(fLock); 326 Exclusive ac(fLock);
334 this->internalPurge(fTotalMemoryUsed); 327 this->internalPurge(fTotalMemoryUsed);
335 } 328 }
336 329
337 /* This guy calls the visitor from within the mutext lock, so the visitor 330 /* This guy calls the visitor from within the mutext lock, so the visitor
338 cannot: 331 cannot:
339 - take too much time 332 - take too much time
340 - try to acquire the mutext again 333 - try to acquire the mutext again
341 - call a fontscaler (which might call into the cache) 334 - call a fontscaler (which might call into the cache)
342 */ 335 */
343 SkGlyphCache* SkGlyphCache::VisitCache(SkTypeface* typeface, 336 SkGlyphCache* SkGlyphCache::VisitCache(SkTypeface* typeface,
344 const SkDescriptor* desc, 337 const SkDescriptor* desc,
345 bool (*proc)(const SkGlyphCache*, void*), 338 bool (*proc)(const SkGlyphCache*, void*),
346 void* context) { 339 void* context) {
347 if (!typeface) { 340 if (!typeface) {
348 typeface = SkTypeface::GetDefaultTypeface(); 341 typeface = SkTypeface::GetDefaultTypeface();
349 } 342 }
350 SkASSERT(desc); 343 SkASSERT(desc);
351 344
352 SkGlyphCache_Globals& globals = get_globals(); 345 SkGlyphCache_Globals& globals = get_globals();
353 SkGlyphCache* cache; 346 SkGlyphCache* cache;
354 347
355 { 348 {
356 AutoAcquire ac(globals.fLock); 349 Exclusive ac(globals.fLock);
357 350
358 globals.validate(); 351 globals.validate();
359 352
360 for (cache = globals.internalGetHead(); cache != nullptr; cache = cache- >fNext) { 353 for (cache = globals.internalGetHead(); cache != nullptr; cache = cache- >fNext) {
361 if (cache->fDesc->equals(*desc)) { 354 if (cache->fDesc->equals(*desc)) {
362 globals.internalDetachCache(cache); 355 globals.internalDetachCache(cache);
363 if (!proc(cache, context)) { 356 if (!proc(cache, context)) {
364 globals.internalAttachCacheToHead(cache); 357 globals.internalAttachCacheToHead(cache);
365 cache = nullptr; 358 cache = nullptr;
366 } 359 }
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
459 if (dump->getRequestedDetails() == SkTraceMemoryDump::kLight_LevelOfDetail) { 452 if (dump->getRequestedDetails() == SkTraceMemoryDump::kLight_LevelOfDetail) {
460 dump->setMemoryBacking(gGlyphCacheDumpName, "malloc", nullptr); 453 dump->setMemoryBacking(gGlyphCacheDumpName, "malloc", nullptr);
461 return; 454 return;
462 } 455 }
463 456
464 SkGlyphCache::VisitAll(sk_trace_dump_visitor, dump); 457 SkGlyphCache::VisitAll(sk_trace_dump_visitor, dump);
465 } 458 }
466 459
467 void SkGlyphCache::VisitAll(Visitor visitor, void* context) { 460 void SkGlyphCache::VisitAll(Visitor visitor, void* context) {
468 SkGlyphCache_Globals& globals = get_globals(); 461 SkGlyphCache_Globals& globals = get_globals();
469 AutoAcquire ac(globals.fLock); 462 Exclusive ac(globals.fLock);
470 SkGlyphCache* cache; 463 SkGlyphCache* cache;
471 464
472 globals.validate(); 465 globals.validate();
473 466
474 for (cache = globals.internalGetHead(); cache != nullptr; cache = cache->fNe xt) { 467 for (cache = globals.internalGetHead(); cache != nullptr; cache = cache->fNe xt) {
475 visitor(*cache, context); 468 visitor(*cache, context);
476 } 469 }
477 } 470 }
478 471
479 /////////////////////////////////////////////////////////////////////////////// 472 ///////////////////////////////////////////////////////////////////////////////
480 473
481 void SkGlyphCache_Globals::attachCacheToHead(SkGlyphCache* cache) { 474 void SkGlyphCache_Globals::attachCacheToHead(SkGlyphCache* cache) {
482 AutoAcquire ac(fLock); 475 Exclusive ac(fLock);
483 476
484 this->validate(); 477 this->validate();
485 cache->validate(); 478 cache->validate();
486 479
487 this->internalAttachCacheToHead(cache); 480 this->internalAttachCacheToHead(cache);
488 this->internalPurge(); 481 this->internalPurge();
489 } 482 }
490 483
491 SkGlyphCache* SkGlyphCache_Globals::internalGetTail() const { 484 SkGlyphCache* SkGlyphCache_Globals::internalGetTail() const {
492 SkGlyphCache* cache = fHead; 485 SkGlyphCache* cache = fHead;
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 } 639 }
647 640
648 void SkGraphics::PurgeFontCache() { 641 void SkGraphics::PurgeFontCache() {
649 get_globals().purgeAll(); 642 get_globals().purgeAll();
650 SkTypefaceCache::PurgeAll(); 643 SkTypefaceCache::PurgeAll();
651 } 644 }
652 645
653 // TODO(herb): clean up TLS apis. 646 // TODO(herb): clean up TLS apis.
654 size_t SkGraphics::GetTLSFontCacheLimit() { return 0; } 647 size_t SkGraphics::GetTLSFontCacheLimit() { return 0; }
655 void SkGraphics::SetTLSFontCacheLimit(size_t bytes) { } 648 void SkGraphics::SetTLSFontCacheLimit(size_t bytes) { }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698