@@ -149,57 +149,62 @@ void DisplayList::clearResources() {
149149 delete mTransformMatrix3D ;
150150 delete mStaticMatrix ;
151151 delete mAnimationMatrix ;
152+
152153 mTransformMatrix = NULL ;
153154 mTransformCamera = NULL ;
154155 mTransformMatrix3D = NULL ;
155156 mStaticMatrix = NULL ;
156157 mAnimationMatrix = NULL ;
157158
158159 Caches& caches = Caches::getInstance ();
160+ caches.resourceCache .lock ();
159161
160162 for (size_t i = 0 ; i < mBitmapResources .size (); i++) {
161- caches.resourceCache .decrementRefcount (mBitmapResources .itemAt (i));
163+ caches.resourceCache .decrementRefcountLocked (mBitmapResources .itemAt (i));
162164 }
163- mBitmapResources .clear ();
164165
165166 for (size_t i = 0 ; i < mOwnedBitmapResources .size (); i++) {
166167 SkBitmap* bitmap = mOwnedBitmapResources .itemAt (i);
167- caches.resourceCache .decrementRefcount (bitmap);
168- caches.resourceCache .destructor (bitmap);
168+ caches.resourceCache .decrementRefcountLocked (bitmap);
169+ caches.resourceCache .destructorLocked (bitmap);
169170 }
170- mOwnedBitmapResources .clear ();
171171
172172 for (size_t i = 0 ; i < mFilterResources .size (); i++) {
173- caches.resourceCache .decrementRefcount (mFilterResources .itemAt (i));
173+ caches.resourceCache .decrementRefcountLocked (mFilterResources .itemAt (i));
174174 }
175- mFilterResources .clear ();
176175
177176 for (size_t i = 0 ; i < mShaders .size (); i++) {
178- caches.resourceCache .decrementRefcount (mShaders .itemAt (i));
179- caches.resourceCache .destructor (mShaders .itemAt (i));
177+ caches.resourceCache .decrementRefcountLocked (mShaders .itemAt (i));
178+ caches.resourceCache .destructorLocked (mShaders .itemAt (i));
180179 }
181- mShaders .clear ();
180+
181+ for (size_t i = 0 ; i < mSourcePaths .size (); i++) {
182+ caches.resourceCache .decrementRefcountLocked (mSourcePaths .itemAt (i));
183+ }
184+
185+ caches.resourceCache .unlock ();
182186
183187 for (size_t i = 0 ; i < mPaints .size (); i++) {
184188 delete mPaints .itemAt (i);
185189 }
186- mPaints .clear ();
187190
188191 for (size_t i = 0 ; i < mPaths .size (); i++) {
189192 SkPath* path = mPaths .itemAt (i);
190193 caches.pathCache .remove (path);
191194 delete path;
192195 }
193- mPaths .clear ();
194-
195- for (size_t i = 0 ; i < mSourcePaths .size (); i++) {
196- caches.resourceCache .decrementRefcount (mSourcePaths .itemAt (i));
197- }
198- mSourcePaths .clear ();
199196
200197 for (size_t i = 0 ; i < mMatrices .size (); i++) {
201198 delete mMatrices .itemAt (i);
202199 }
200+
201+ mBitmapResources .clear ();
202+ mOwnedBitmapResources .clear ();
203+ mFilterResources .clear ();
204+ mShaders .clear ();
205+ mSourcePaths .clear ();
206+ mPaints .clear ();
207+ mPaths .clear ();
203208 mMatrices .clear ();
204209}
205210
@@ -223,35 +228,44 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde
223228 mReader .setMemory (buffer, mSize );
224229
225230 Caches& caches = Caches::getInstance ();
231+ caches.resourceCache .lock ();
226232
227233 const Vector<SkBitmap*>& bitmapResources = recorder.getBitmapResources ();
228234 for (size_t i = 0 ; i < bitmapResources.size (); i++) {
229235 SkBitmap* resource = bitmapResources.itemAt (i);
230236 mBitmapResources .add (resource);
231- caches.resourceCache .incrementRefcount (resource);
237+ caches.resourceCache .incrementRefcountLocked (resource);
232238 }
233239
234240 const Vector<SkBitmap*> &ownedBitmapResources = recorder.getOwnedBitmapResources ();
235241 for (size_t i = 0 ; i < ownedBitmapResources.size (); i++) {
236242 SkBitmap* resource = ownedBitmapResources.itemAt (i);
237243 mOwnedBitmapResources .add (resource);
238- caches.resourceCache .incrementRefcount (resource);
244+ caches.resourceCache .incrementRefcountLocked (resource);
239245 }
240246
241247 const Vector<SkiaColorFilter*>& filterResources = recorder.getFilterResources ();
242248 for (size_t i = 0 ; i < filterResources.size (); i++) {
243249 SkiaColorFilter* resource = filterResources.itemAt (i);
244250 mFilterResources .add (resource);
245- caches.resourceCache .incrementRefcount (resource);
251+ caches.resourceCache .incrementRefcountLocked (resource);
246252 }
247253
248254 const Vector<SkiaShader*>& shaders = recorder.getShaders ();
249255 for (size_t i = 0 ; i < shaders.size (); i++) {
250256 SkiaShader* resource = shaders.itemAt (i);
251257 mShaders .add (resource);
252- caches.resourceCache .incrementRefcount (resource);
258+ caches.resourceCache .incrementRefcountLocked (resource);
259+ }
260+
261+ const SortedVector<SkPath*>& sourcePaths = recorder.getSourcePaths ();
262+ for (size_t i = 0 ; i < sourcePaths.size (); i++) {
263+ mSourcePaths .add (sourcePaths.itemAt (i));
264+ caches.resourceCache .incrementRefcountLocked (sourcePaths.itemAt (i));
253265 }
254266
267+ caches.resourceCache .unlock ();
268+
255269 const Vector<SkPaint*>& paints = recorder.getPaints ();
256270 for (size_t i = 0 ; i < paints.size (); i++) {
257271 mPaints .add (paints.itemAt (i));
@@ -262,12 +276,6 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde
262276 mPaths .add (paths.itemAt (i));
263277 }
264278
265- const SortedVector<SkPath*>& sourcePaths = recorder.getSourcePaths ();
266- for (size_t i = 0 ; i < sourcePaths.size (); i++) {
267- mSourcePaths .add (sourcePaths.itemAt (i));
268- caches.resourceCache .incrementRefcount (sourcePaths.itemAt (i));
269- }
270-
271279 const Vector<SkMatrix*>& matrices = recorder.getMatrices ();
272280 for (size_t i = 0 ; i < matrices.size (); i++) {
273281 mMatrices .add (matrices.itemAt (i));
@@ -1309,7 +1317,8 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
13091317// Base structure
13101318// /////////////////////////////////////////////////////////////////////////////
13111319
1312- DisplayListRenderer::DisplayListRenderer () : mWriter (MIN_WRITER_SIZE),
1320+ DisplayListRenderer::DisplayListRenderer ():
1321+ mCaches (Caches::getInstance()), mWriter (MIN_WRITER_SIZE),
13131322 mTranslateX (0 .0f ), mTranslateY (0 .0f ), mHasTranslate (false ), mHasDrawOps (false ) {
13141323}
13151324
@@ -1320,34 +1329,38 @@ DisplayListRenderer::~DisplayListRenderer() {
13201329void DisplayListRenderer::reset () {
13211330 mWriter .reset ();
13221331
1323- Caches& caches = Caches::getInstance ();
1332+ mCaches .resourceCache .lock ();
1333+
13241334 for (size_t i = 0 ; i < mBitmapResources .size (); i++) {
1325- caches .resourceCache .decrementRefcount (mBitmapResources .itemAt (i));
1335+ mCaches .resourceCache .decrementRefcountLocked (mBitmapResources .itemAt (i));
13261336 }
1327- mBitmapResources .clear ();
13281337
13291338 for (size_t i = 0 ; i < mOwnedBitmapResources .size (); i++) {
1330- SkBitmap* bitmap = mOwnedBitmapResources .itemAt (i);
1331- caches.resourceCache .decrementRefcount (bitmap);
1339+ mCaches .resourceCache .decrementRefcountLocked (mOwnedBitmapResources .itemAt (i));
13321340 }
1333- mOwnedBitmapResources .clear ();
13341341
13351342 for (size_t i = 0 ; i < mFilterResources .size (); i++) {
1336- caches .resourceCache .decrementRefcount (mFilterResources .itemAt (i));
1343+ mCaches .resourceCache .decrementRefcountLocked (mFilterResources .itemAt (i));
13371344 }
1338- mFilterResources .clear ();
13391345
13401346 for (size_t i = 0 ; i < mShaders .size (); i++) {
1341- caches .resourceCache .decrementRefcount (mShaders .itemAt (i));
1347+ mCaches .resourceCache .decrementRefcountLocked (mShaders .itemAt (i));
13421348 }
1343- mShaders .clear ();
1344- mShaderMap .clear ();
13451349
13461350 for (size_t i = 0 ; i < mSourcePaths .size (); i++) {
1347- caches .resourceCache .decrementRefcount (mSourcePaths .itemAt (i));
1351+ mCaches .resourceCache .decrementRefcountLocked (mSourcePaths .itemAt (i));
13481352 }
1353+
1354+ mCaches .resourceCache .unlock ();
1355+
1356+ mBitmapResources .clear ();
1357+ mOwnedBitmapResources .clear ();
1358+ mFilterResources .clear ();
13491359 mSourcePaths .clear ();
13501360
1361+ mShaders .clear ();
1362+ mShaderMap .clear ();
1363+
13511364 mPaints .clear ();
13521365 mPaintMap .clear ();
13531366
0 commit comments