• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright 2011 Google Inc.
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 #include "SkImageRef_GlobalPool.h"
9 #include "SkImageRefPool.h"
10 #include "SkThread.h"
11 
12 extern SkBaseMutex gImageRefMutex;
13 
14 /*
15  *  This returns the lazily-allocated global pool. It must be called
16  *  from inside the guard mutex, so we safely only ever allocate 1.
17  */
GetGlobalPool()18 static SkImageRefPool* GetGlobalPool() {
19     static SkImageRefPool* gPool;
20     if (NULL == gPool) {
21         gPool = SkNEW(SkImageRefPool);
22         // call sk_atexit(...) when we have that, to free the global pool
23     }
24     return gPool;
25 }
26 
SkImageRef_GlobalPool(SkStream * stream,SkBitmap::Config config,int sampleSize)27 SkImageRef_GlobalPool::SkImageRef_GlobalPool(SkStream* stream,
28                                              SkBitmap::Config config,
29                                              int sampleSize)
30         : SkImageRef(stream, config, sampleSize) {
31     this->mutex()->acquire();
32     GetGlobalPool()->addToHead(this);
33     this->mutex()->release();
34 }
35 
~SkImageRef_GlobalPool()36 SkImageRef_GlobalPool::~SkImageRef_GlobalPool() {
37     this->mutex()->acquire();
38     GetGlobalPool()->detach(this);
39     this->mutex()->release();
40 }
41 
42 /*  By design, onUnlockPixels() already is inside the mutex-lock,
43  *  and it is the (indirect) caller of onDecode(), therefore we can assume
44  *  that we also are already inside the mutex. Hence, we can reference
45  *  the global-pool directly.
46  */
onDecode(SkImageDecoder * codec,SkStream * stream,SkBitmap * bitmap,SkBitmap::Config config,SkImageDecoder::Mode mode)47 bool SkImageRef_GlobalPool::onDecode(SkImageDecoder* codec, SkStream* stream,
48                                      SkBitmap* bitmap, SkBitmap::Config config,
49                                      SkImageDecoder::Mode mode) {
50     if (!this->INHERITED::onDecode(codec, stream, bitmap, config, mode)) {
51         return false;
52     }
53     if (mode == SkImageDecoder::kDecodePixels_Mode) {
54         // no need to grab the mutex here, it has already been acquired.
55         GetGlobalPool()->justAddedPixels(this);
56     }
57     return true;
58 }
59 
onUnlockPixels()60 void SkImageRef_GlobalPool::onUnlockPixels() {
61     this->INHERITED::onUnlockPixels();
62 
63     // by design, onUnlockPixels() already is inside the mutex-lock
64     GetGlobalPool()->canLosePixels(this);
65 }
66 
SkImageRef_GlobalPool(SkFlattenableReadBuffer & buffer)67 SkImageRef_GlobalPool::SkImageRef_GlobalPool(SkFlattenableReadBuffer& buffer)
68         : INHERITED(buffer) {
69     this->mutex()->acquire();
70     GetGlobalPool()->addToHead(this);
71     this->mutex()->release();
72 }
73 
Create(SkFlattenableReadBuffer & buffer)74 SkPixelRef* SkImageRef_GlobalPool::Create(SkFlattenableReadBuffer& buffer) {
75     return SkNEW_ARGS(SkImageRef_GlobalPool, (buffer));
76 }
77 
SK_DEFINE_PIXEL_REF_REGISTRAR(SkImageRef_GlobalPool)78 SK_DEFINE_PIXEL_REF_REGISTRAR(SkImageRef_GlobalPool)
79 
80 ///////////////////////////////////////////////////////////////////////////////
81 // global imagerefpool wrappers
82 
83 size_t SkImageRef_GlobalPool::GetRAMBudget() {
84     SkAutoMutexAcquire ac(gImageRefMutex);
85     return GetGlobalPool()->getRAMBudget();
86 }
87 
SetRAMBudget(size_t size)88 void SkImageRef_GlobalPool::SetRAMBudget(size_t size) {
89     SkAutoMutexAcquire ac(gImageRefMutex);
90     GetGlobalPool()->setRAMBudget(size);
91 }
92 
GetRAMUsed()93 size_t SkImageRef_GlobalPool::GetRAMUsed() {
94     SkAutoMutexAcquire ac(gImageRefMutex);
95     return GetGlobalPool()->getRAMUsed();
96 }
97 
SetRAMUsed(size_t usage)98 void SkImageRef_GlobalPool::SetRAMUsed(size_t usage) {
99     SkAutoMutexAcquire ac(gImageRefMutex);
100     GetGlobalPool()->setRAMUsed(usage);
101 }
102 
DumpPool()103 void SkImageRef_GlobalPool::DumpPool() {
104     SkAutoMutexAcquire ac(gImageRefMutex);
105     GetGlobalPool()->dump();
106 }
107