|
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 SK_DECLARE_STATIC_MUTEX(gGlobalPoolMutex); |
|
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 */ |
|
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 |
|
27 SkImageRef_GlobalPool::SkImageRef_GlobalPool(const SkImageInfo& info, |
|
28 SkStreamRewindable* stream, |
|
29 int sampleSize) |
|
30 : SkImageRef(info, stream, sampleSize, &gGlobalPoolMutex) { |
|
31 SkASSERT(&gGlobalPoolMutex == this->mutex()); |
|
32 SkAutoMutexAcquire ac(gGlobalPoolMutex); |
|
33 GetGlobalPool()->addToHead(this); |
|
34 } |
|
35 |
|
36 SkImageRef_GlobalPool::~SkImageRef_GlobalPool() { |
|
37 SkASSERT(&gGlobalPoolMutex == this->mutex()); |
|
38 SkAutoMutexAcquire ac(gGlobalPoolMutex); |
|
39 GetGlobalPool()->detach(this); |
|
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 */ |
|
47 bool SkImageRef_GlobalPool::onDecode(SkImageDecoder* codec, SkStreamRewindable* 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 |
|
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 |
|
67 SkImageRef_GlobalPool::SkImageRef_GlobalPool(SkReadBuffer& buffer) |
|
68 : INHERITED(buffer, &gGlobalPoolMutex) { |
|
69 SkASSERT(&gGlobalPoolMutex == this->mutex()); |
|
70 SkAutoMutexAcquire ac(gGlobalPoolMutex); |
|
71 GetGlobalPool()->addToHead(this); |
|
72 } |
|
73 |
|
74 /////////////////////////////////////////////////////////////////////////////// |
|
75 // global imagerefpool wrappers |
|
76 |
|
77 size_t SkImageRef_GlobalPool::GetRAMBudget() { |
|
78 SkAutoMutexAcquire ac(gGlobalPoolMutex); |
|
79 return GetGlobalPool()->getRAMBudget(); |
|
80 } |
|
81 |
|
82 void SkImageRef_GlobalPool::SetRAMBudget(size_t size) { |
|
83 SkAutoMutexAcquire ac(gGlobalPoolMutex); |
|
84 GetGlobalPool()->setRAMBudget(size); |
|
85 } |
|
86 |
|
87 size_t SkImageRef_GlobalPool::GetRAMUsed() { |
|
88 SkAutoMutexAcquire ac(gGlobalPoolMutex); |
|
89 return GetGlobalPool()->getRAMUsed(); |
|
90 } |
|
91 |
|
92 void SkImageRef_GlobalPool::SetRAMUsed(size_t usage) { |
|
93 SkAutoMutexAcquire ac(gGlobalPoolMutex); |
|
94 GetGlobalPool()->setRAMUsed(usage); |
|
95 } |
|
96 |
|
97 void SkImageRef_GlobalPool::DumpPool() { |
|
98 SkAutoMutexAcquire ac(gGlobalPoolMutex); |
|
99 GetGlobalPool()->dump(); |
|
100 } |