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

Side by Side Diff: chrome/common/resource_bundle.cc

Issue 9246: Tracing showed that the resource bundle lock was held for long periods of tim... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 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 | Annotate | Revision Log
« 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 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/common/resource_bundle.h" 5 #include "chrome/common/resource_bundle.h"
6 6
7 #include <atlbase.h> 7 #include <atlbase.h>
8 8
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/gfx/png_decoder.h" 10 #include "base/gfx/png_decoder.h"
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 NOTREACHED() << "Unable to decode theme resource " << resource_id; 139 NOTREACHED() << "Unable to decode theme resource " << resource_id;
140 return NULL; 140 return NULL;
141 } 141 }
142 142
143 return PNGDecoder::CreateSkBitmapFromBGRAFormat(png_data, 143 return PNGDecoder::CreateSkBitmapFromBGRAFormat(png_data,
144 image_width, 144 image_width,
145 image_height); 145 image_height);
146 } 146 }
147 147
148 SkBitmap* ResourceBundle::GetBitmapNamed(int resource_id) { 148 SkBitmap* ResourceBundle::GetBitmapNamed(int resource_id) {
149 AutoLock lock_scope(lock_); 149 // Check to see if we already have the Skia image in the cache.
150 150 {
151 SkImageMap::const_iterator found = skia_images_.find(resource_id); 151 AutoLock lock_scope(lock_);
152 SkBitmap* bitmap = NULL; 152 SkImageMap::const_iterator found = skia_images_.find(resource_id);
153 153 if (found != skia_images_.end())
154 // If not found load and store the image 154 return found->second;
155 if (found == skia_images_.end()) {
156 // Try to load the bitmap from the theme dll.
157 if (theme_dll_)
158 bitmap = LoadBitmap(theme_dll_, resource_id);
159 // We did not find the bitmap in the theme DLL, try the current one.
160 if (!bitmap)
161 bitmap = LoadBitmap(_AtlBaseModule.GetModuleInstance(), resource_id);
162 skia_images_[resource_id] = bitmap;
163 } else {
164 bitmap = found->second;
165 } 155 }
166 156
167 // This bitmap will be returned when a bitmap is requested that can not be 157 scoped_ptr<SkBitmap> bitmap;
168 // found. The data inside is lazily initialized, so users must lock and
169 static SkBitmap* empty_bitmap = NULL;
170 158
171 // Handle the case where loading the bitmap failed. 159 // Try to load the bitmap from the theme dll.
172 if (!bitmap) { 160 if (theme_dll_)
161 bitmap.reset(LoadBitmap(theme_dll_, resource_id));
162
163 // If we did not find the bitmap in the theme DLL, try the current one.
164 if (!bitmap.get())
165 bitmap.reset(LoadBitmap(_AtlBaseModule.GetModuleInstance(), resource_id));
166
167 // We loaded successfully. Cache the Skia version of the bitmap.
168 if (bitmap.get()) {
169 AutoLock lock_scope(lock_);
170
171 // Another thread raced us, and has already cached the skia image.
172 if (skia_images_.count(resource_id))
173 return skia_images_[resource_id];
174
175 skia_images_[resource_id] = bitmap.get();
176 return bitmap.release();
177 }
178
179 // We failed to retrieve the bitmap, show a debugging red square.
180 {
173 LOG(WARNING) << "Unable to load bitmap with id " << resource_id; 181 LOG(WARNING) << "Unable to load bitmap with id " << resource_id;
174 NOTREACHED(); // Want to assert in debug mode. 182 NOTREACHED(); // Want to assert in debug mode.
183
184 AutoLock lock_scope(lock_); // Guard empty_bitmap initialization.
185
186 static SkBitmap* empty_bitmap = NULL;
175 if (!empty_bitmap) { 187 if (!empty_bitmap) {
176 // The placeholder bitmap is bright red so people notice the problem.» 188 // The placeholder bitmap is bright red so people notice the problem.
177 empty_bitmap = new SkBitmap();» 189 // This bitmap will be leaked, but this code should never be hit.
190 empty_bitmap = new SkBitmap();
178 empty_bitmap->setConfig(SkBitmap::kARGB_8888_Config, 32, 32); 191 empty_bitmap->setConfig(SkBitmap::kARGB_8888_Config, 32, 32);
179 empty_bitmap->allocPixels(); 192 empty_bitmap->allocPixels();
180 empty_bitmap->eraseARGB(255, 255, 0, 0); 193 empty_bitmap->eraseARGB(255, 255, 0, 0);
181 } 194 }
182 return empty_bitmap; 195 return empty_bitmap;
183 } 196 }
184 return bitmap;
185 } 197 }
186 198
187 bool ResourceBundle::LoadImageResourceBytes(int resource_id, 199 bool ResourceBundle::LoadImageResourceBytes(int resource_id,
188 vector<unsigned char>* bytes) { 200 vector<unsigned char>* bytes) {
189 return LoadModuleResourceBytes(theme_dll_, resource_id, bytes); 201 return LoadModuleResourceBytes(theme_dll_, resource_id, bytes);
190 } 202 }
191 203
192 bool ResourceBundle::LoadDataResourceBytes(int resource_id, 204 bool ResourceBundle::LoadDataResourceBytes(int resource_id,
193 vector<unsigned char>* bytes) { 205 vector<unsigned char>* bytes) {
194 return LoadModuleResourceBytes(_AtlBaseModule.GetModuleInstance(), 206 return LoadModuleResourceBytes(_AtlBaseModule.GetModuleInstance(),
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 return *medium_bold_font_; 321 return *medium_bold_font_;
310 case LargeFont: 322 case LargeFont:
311 return *large_font_; 323 return *large_font_;
312 case WebFont: 324 case WebFont:
313 return *web_font_; 325 return *web_font_;
314 default: 326 default:
315 return *base_font_; 327 return *base_font_;
316 } 328 }
317 } 329 }
318 330
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