Chromium Code Reviews| Index: base/mime_util_xdg.cc |
| =================================================================== |
| --- base/mime_util_xdg.cc (revision 107790) |
| +++ base/mime_util_xdg.cc (working copy) |
| @@ -14,6 +14,7 @@ |
| #include <vector> |
| #include "base/file_util.h" |
| +#include "base/lazy_instance.h" |
| #include "base/logging.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/memory/singleton.h" |
| @@ -26,32 +27,37 @@ |
| namespace { |
| -// None of the XDG stuff is thread-safe, so serialize all accesss under |
| +// None of the XDG stuff is thread-safe, so serialize all access under |
| // this lock. |
| -base::Lock g_mime_util_xdg_lock; |
| +static base::LazyInstance<base::Lock> |
|
willchan no longer on Chromium
2011/10/28 21:42:25
I wonder if you should use LeakyLazyInstance. Not
Lei Zhang
2011/10/28 21:54:02
Would you say that's true of all locks? There's 7
|
| + g_mime_util_xdg_lock(base::LINKER_INITIALIZED); |
| class IconTheme; |
| class MimeUtilConstants { |
| public: |
| + typedef std::map<std::string, IconTheme*> IconThemeMap; |
| + typedef std::map<FilePath, int> IconDirMtimeMap; |
| + typedef std::vector<std::string> IconFormats; |
| + |
| + // In seconds, specified by icon theme specs. |
| + static const int kUpdateInterval = 5; |
| + |
| + static const size_t kDefaultThemeNum = 4; |
| + |
| static MimeUtilConstants* GetInstance() { |
| return Singleton<MimeUtilConstants>::get(); |
| } |
| - // In seconds, specified by icon theme specs. |
| - const int kUpdateInterval; |
| - |
| // Store icon directories and their mtimes. |
| - std::map<FilePath, int>* icon_dirs_; |
| + IconDirMtimeMap* icon_dirs_; |
| // Store icon formats. |
| - std::vector<std::string> icon_formats_; |
| + IconFormats icon_formats_; |
| // Store loaded icon_theme. |
| - std::map<std::string, IconTheme*>* icon_themes_; |
| + IconThemeMap* icon_themes_; |
| - static const size_t kDefaultThemeNum = 4; |
| - |
| // The default theme. |
| IconTheme* default_themes_[kDefaultThemeNum]; |
| @@ -64,8 +70,7 @@ |
| private: |
| MimeUtilConstants() |
| - : kUpdateInterval(5), |
| - icon_dirs_(NULL), |
| + : icon_dirs_(NULL), |
| icon_themes_(NULL), |
| last_check_time_(0) { |
| icon_formats_.push_back(".png"); |
| @@ -164,9 +169,9 @@ |
| base::ThreadRestrictions::AssertIOAllowed(); |
| // Iterate on all icon directories to find directories of the specified |
| // theme and load the first encountered index.theme. |
| - std::map<FilePath, int>::iterator iter; |
| + MimeUtilConstants::IconDirMtimeMap::iterator iter; |
| FilePath theme_path; |
| - std::map<FilePath, int>* icon_dirs = |
| + MimeUtilConstants::IconDirMtimeMap* icon_dirs = |
| MimeUtilConstants::GetInstance()->icon_dirs_; |
| for (iter = icon_dirs->begin(); iter != icon_dirs->end(); ++iter) { |
| theme_path = iter->first.Append(name); |
| @@ -227,7 +232,7 @@ |
| IconTheme* IconTheme::LoadTheme(const std::string& theme_name) { |
| scoped_ptr<IconTheme> theme; |
| - std::map<std::string, IconTheme*>* icon_themes = |
| + MimeUtilConstants::IconThemeMap* icon_themes = |
| MimeUtilConstants::GetInstance()->icon_themes_; |
| if (icon_themes->find(theme_name) != icon_themes->end()) { |
| theme.reset((*icon_themes)[theme_name]); |
| @@ -244,7 +249,7 @@ |
| const std::string& subdir) { |
| FilePath icon_path; |
| std::list<FilePath>::iterator dir_iter; |
| - std::vector<std::string>* icon_formats = |
| + MimeUtilConstants::IconFormats* icon_formats = |
| &MimeUtilConstants::GetInstance()->icon_formats_; |
| for (dir_iter = dirs_.begin(); dir_iter != dirs_.end(); ++dir_iter) { |
| for (size_t i = 0; i < icon_formats->size(); ++i) { |
| @@ -446,8 +451,8 @@ |
| MimeUtilConstants* constants = MimeUtilConstants::GetInstance(); |
| if (constants->last_check_time_ == 0) { |
| - constants->icon_dirs_ = new std::map<FilePath, int>; |
| - constants->icon_themes_ = new std::map<std::string, IconTheme*>; |
| + constants->icon_dirs_ = new MimeUtilConstants::IconDirMtimeMap; |
| + constants->icon_themes_ = new MimeUtilConstants::IconThemeMap; |
| InitIconDir(); |
| constants->last_check_time_ = now; |
| } else { |
| @@ -462,9 +467,9 @@ |
| FilePath LookupFallbackIcon(const std::string& icon_name) { |
| FilePath icon; |
| MimeUtilConstants* constants = MimeUtilConstants::GetInstance(); |
| - std::map<FilePath, int>::iterator iter; |
| - std::map<FilePath, int>* icon_dirs = constants->icon_dirs_; |
| - std::vector<std::string>* icon_formats = &constants->icon_formats_; |
| + MimeUtilConstants::IconDirMtimeMap::iterator iter; |
| + MimeUtilConstants::IconDirMtimeMap* icon_dirs = constants->icon_dirs_; |
| + MimeUtilConstants::IconFormats* icon_formats = &constants->icon_formats_; |
| for (iter = icon_dirs->begin(); iter != icon_dirs->end(); ++iter) { |
| for (size_t i = 0; i < icon_formats->size(); ++i) { |
| icon = iter->first.Append(icon_name + (*icon_formats)[i]); |
| @@ -527,7 +532,7 @@ |
| FilePath LookupIconInDefaultTheme(const std::string& icon_name, int size) { |
| EnsureUpdated(); |
| MimeUtilConstants* constants = MimeUtilConstants::GetInstance(); |
| - std::map<std::string, IconTheme*>* icon_themes = constants->icon_themes_; |
| + MimeUtilConstants::IconThemeMap* icon_themes = constants->icon_themes_; |
| if (icon_themes->empty()) |
| InitDefaultThemes(); |
| @@ -556,13 +561,13 @@ |
| std::string GetFileMimeType(const FilePath& filepath) { |
| base::ThreadRestrictions::AssertIOAllowed(); |
| - base::AutoLock scoped_lock(g_mime_util_xdg_lock); |
| + base::AutoLock scoped_lock(g_mime_util_xdg_lock.Get()); |
| return xdg_mime_get_mime_type_from_file_name(filepath.value().c_str()); |
| } |
| std::string GetDataMimeType(const std::string& data) { |
| base::ThreadRestrictions::AssertIOAllowed(); |
| - base::AutoLock scoped_lock(g_mime_util_xdg_lock); |
| + base::AutoLock scoped_lock(g_mime_util_xdg_lock.Get()); |
| return xdg_mime_get_mime_type_for_data(data.data(), data.length(), NULL); |
| } |
| @@ -591,7 +596,7 @@ |
| FilePath icon_file; |
| { |
| - base::AutoLock scoped_lock(g_mime_util_xdg_lock); |
| + base::AutoLock scoped_lock(g_mime_util_xdg_lock.Get()); |
| const char *icon = xdg_mime_get_icon(mime_type.c_str()); |
| icon_name = std::string(icon ? icon : ""); |
| } |