| Index: base/path_service.cc
|
| diff --git a/base/path_service.cc b/base/path_service.cc
|
| index 57cbc33f34f7f3e3658fe00244c6a818ce3924a4..8660c424c77cbdb24a853925dce249a2ae27ed45 100644
|
| --- a/base/path_service.cc
|
| +++ b/base/path_service.cc
|
| @@ -31,7 +31,6 @@ namespace base {
|
| namespace {
|
|
|
| typedef base::hash_map<int, FilePath> PathMap;
|
| -typedef base::hash_set<int> PathSet;
|
|
|
| // We keep a linked list of providers. In a debug build we ensure that no two
|
| // providers claim overlapping keys.
|
| @@ -94,8 +93,8 @@ static Provider base_provider_posix = {
|
|
|
| struct PathData {
|
| Lock lock;
|
| - PathMap cache; // Track mappings from path key to path value.
|
| - PathSet overrides; // Track whether a path has been overridden.
|
| + PathMap cache; // Cache mappings from path key to path value.
|
| + PathMap overrides; // Track path overrides.
|
| Provider* providers; // Linked list of path service providers.
|
|
|
| PathData() {
|
| @@ -141,6 +140,20 @@ bool PathService::GetFromCache(int key, FilePath* result) {
|
| }
|
|
|
| // static
|
| +bool PathService::GetFromOverrides(int key, FilePath* result) {
|
| + PathData* path_data = GetPathData();
|
| + AutoLock scoped_lock(path_data->lock);
|
| +
|
| + // check for an overriden version.
|
| + PathMap::const_iterator it = path_data->overrides.find(key);
|
| + if (it != path_data->overrides.end()) {
|
| + *result = it->second;
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +// static
|
| void PathService::AddToCache(int key, const FilePath& path) {
|
| PathData* path_data = GetPathData();
|
| AutoLock scoped_lock(path_data->lock);
|
| @@ -165,6 +178,9 @@ bool PathService::Get(int key, FilePath* result) {
|
| if (GetFromCache(key, result))
|
| return true;
|
|
|
| + if (GetFromOverrides(key, result))
|
| + return true;
|
| +
|
| FilePath path;
|
|
|
| // search providers for the requested path
|
| @@ -199,14 +215,6 @@ bool PathService::Get(int key, std::wstring* result) {
|
| }
|
| #endif
|
|
|
| -bool PathService::IsOverridden(int key) {
|
| - PathData* path_data = GetPathData();
|
| - DCHECK(path_data);
|
| -
|
| - AutoLock scoped_lock(path_data->lock);
|
| - return path_data->overrides.find(key) != path_data->overrides.end();
|
| -}
|
| -
|
| bool PathService::Override(int key, const FilePath& path) {
|
| PathData* path_data = GetPathData();
|
| DCHECK(path_data);
|
| @@ -228,8 +236,14 @@ bool PathService::Override(int key, const FilePath& path) {
|
| return false;
|
|
|
| AutoLock scoped_lock(path_data->lock);
|
| +
|
| + // Clear the cache now. Some of its entries could have depended
|
| + // on the value we are overriding, and are now out of sync with reality.
|
| + path_data->cache.clear();
|
| +
|
| path_data->cache[key] = file_path;
|
| - path_data->overrides.insert(key);
|
| + path_data->overrides[key] = file_path;
|
| +
|
| return true;
|
| }
|
|
|
|
|