Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/browser/profiles/profile_dependency_manager.h" | 5 #include "chrome/browser/profiles/profile_dependency_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <iterator> | 9 #include <iterator> |
| 10 | 10 |
| 11 #include "chrome/browser/background/background_contents_service_factory.h" | |
| 11 #include "chrome/browser/profiles/profile_keyed_service.h" | 12 #include "chrome/browser/profiles/profile_keyed_service.h" |
| 12 #include "chrome/browser/profiles/profile_keyed_service_factory.h" | 13 #include "chrome/browser/profiles/profile_keyed_service_factory.h" |
| 14 #include "chrome/browser/search_engines/template_url_service_factory.h" | |
| 15 #include "chrome/browser/sessions/session_service_factory.h" | |
| 16 #include "chrome/browser/sessions/tab_restore_service_factory.h" | |
| 13 #include "content/common/notification_service.h" | 17 #include "content/common/notification_service.h" |
| 14 | 18 |
| 15 class Profile; | 19 class Profile; |
| 16 | 20 |
| 21 namespace { | |
| 22 | |
| 23 bool g_initialized = false; | |
| 24 | |
| 25 // TODO(erg): This needs to be something else. I don't think putting every | |
| 26 // FooServiceFactory here will scale or is desireable long term. | |
|
Miranda Callahan
2011/07/20 20:53:09
Could you also add a comment here describing the f
| |
| 27 void AssertFactoriesBuilt() { | |
| 28 if (!g_initialized) { | |
| 29 BackgroundContentsServiceFactory::GetInstance(); | |
| 30 SessionServiceFactory::GetInstance(); | |
| 31 TabRestoreServiceFactory::GetInstance(); | |
| 32 TemplateURLServiceFactory::GetInstance(); | |
| 33 | |
| 34 g_initialized = true; | |
| 35 } | |
| 36 } | |
| 37 | |
| 38 } // namespace | |
| 39 | |
| 17 void ProfileDependencyManager::AddComponent( | 40 void ProfileDependencyManager::AddComponent( |
| 18 ProfileKeyedServiceFactory* component) { | 41 ProfileKeyedServiceFactory* component) { |
| 19 all_components_.push_back(component); | 42 all_components_.push_back(component); |
| 20 destruction_order_.clear(); | 43 destruction_order_.clear(); |
| 21 } | 44 } |
| 22 | 45 |
| 23 void ProfileDependencyManager::RemoveComponent( | 46 void ProfileDependencyManager::RemoveComponent( |
| 24 ProfileKeyedServiceFactory* component) { | 47 ProfileKeyedServiceFactory* component) { |
| 25 all_components_.erase(std::remove(all_components_.begin(), | 48 all_components_.erase(std::remove(all_components_.begin(), |
| 26 all_components_.end(), | 49 all_components_.end(), |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 39 | 62 |
| 40 destruction_order_.clear(); | 63 destruction_order_.clear(); |
| 41 } | 64 } |
| 42 | 65 |
| 43 void ProfileDependencyManager::AddEdge(ProfileKeyedServiceFactory* depended, | 66 void ProfileDependencyManager::AddEdge(ProfileKeyedServiceFactory* depended, |
| 44 ProfileKeyedServiceFactory* dependee) { | 67 ProfileKeyedServiceFactory* dependee) { |
| 45 edges_.insert(std::make_pair(depended, dependee)); | 68 edges_.insert(std::make_pair(depended, dependee)); |
| 46 destruction_order_.clear(); | 69 destruction_order_.clear(); |
| 47 } | 70 } |
| 48 | 71 |
| 72 void ProfileDependencyManager::CreateProfileServices(Profile* profile, | |
| 73 bool is_testing_profile) { | |
| 74 #ifndef NDEBUG | |
| 75 // Unmark |profile| as dead. This exists because of unit tests, which will | |
| 76 // often have similar stack structures. 0xWhatever might be created, go out | |
| 77 // of scope, and then a new Profile object might be created at 0xWhatever. | |
| 78 dead_profile_pointers_.erase(profile); | |
| 79 #endif | |
| 80 | |
| 81 AssertFactoriesBuilt(); | |
| 82 | |
| 83 if (destruction_order_.empty()) | |
| 84 BuildDestructionOrder(); | |
| 85 | |
| 86 // Iterate in reverse destruction order for creation. | |
| 87 for (std::vector<ProfileKeyedServiceFactory*>::reverse_iterator rit = | |
| 88 destruction_order_.rbegin(); rit != destruction_order_.rend(); | |
| 89 ++rit) { | |
| 90 if (is_testing_profile && (*rit)->ServiceIsNULLWhileTesting()) { | |
| 91 (*rit)->SetTestingFactory(profile, NULL); | |
| 92 } else if ((*rit)->ServiceIsCreatedWithProfile()) { | |
| 93 // Create the service. | |
| 94 (*rit)->GetServiceForProfile(profile, true); | |
| 95 } | |
| 96 } | |
| 97 } | |
| 98 | |
| 49 void ProfileDependencyManager::DestroyProfileServices(Profile* profile) { | 99 void ProfileDependencyManager::DestroyProfileServices(Profile* profile) { |
| 50 if (destruction_order_.empty()) | 100 if (destruction_order_.empty()) |
| 51 BuildDestructionOrder(); | 101 BuildDestructionOrder(); |
| 52 | 102 |
| 53 for (std::vector<ProfileKeyedServiceFactory*>::const_iterator it = | 103 for (std::vector<ProfileKeyedServiceFactory*>::const_iterator it = |
| 54 destruction_order_.begin(); it != destruction_order_.end(); ++it) { | 104 destruction_order_.begin(); it != destruction_order_.end(); ++it) { |
| 55 (*it)->ProfileShutdown(profile); | 105 (*it)->ProfileShutdown(profile); |
| 56 } | 106 } |
| 57 | 107 |
| 58 #ifndef NDEBUG | 108 #ifndef NDEBUG |
| 59 // The profile is now dead to the rest of the program. | 109 // The profile is now dead to the rest of the program. |
| 60 dead_profile_pointers_.insert(profile); | 110 dead_profile_pointers_.insert(profile); |
| 61 #endif | 111 #endif |
| 62 | 112 |
| 63 for (std::vector<ProfileKeyedServiceFactory*>::const_iterator it = | 113 for (std::vector<ProfileKeyedServiceFactory*>::const_iterator it = |
| 64 destruction_order_.begin(); it != destruction_order_.end(); ++it) { | 114 destruction_order_.begin(); it != destruction_order_.end(); ++it) { |
| 65 (*it)->ProfileDestroyed(profile); | 115 (*it)->ProfileDestroyed(profile); |
| 66 } | 116 } |
| 67 } | 117 } |
| 68 | 118 |
| 69 #ifndef NDEBUG | 119 #ifndef NDEBUG |
| 70 void ProfileDependencyManager::ProfileNowExists(Profile* profile) { | |
| 71 dead_profile_pointers_.erase(profile); | |
| 72 } | |
| 73 | |
| 74 void ProfileDependencyManager::AssertProfileWasntDestroyed(Profile* profile) { | 120 void ProfileDependencyManager::AssertProfileWasntDestroyed(Profile* profile) { |
| 75 if (dead_profile_pointers_.find(profile) != dead_profile_pointers_.end()) { | 121 if (dead_profile_pointers_.find(profile) != dead_profile_pointers_.end()) { |
| 76 NOTREACHED() << "Attempted to access a Profile that was ShutDown(). This " | 122 NOTREACHED() << "Attempted to access a Profile that was ShutDown(). This " |
| 77 << "is most likely a heap smasher in progress. After " | 123 << "is most likely a heap smasher in progress. After " |
| 78 << "ProfileKeyedService::Shutdown() completes, your service " | 124 << "ProfileKeyedService::Shutdown() completes, your service " |
| 79 << "MUST NOT refer to depended Profile services again."; | 125 << "MUST NOT refer to depended Profile services again."; |
| 80 } | 126 } |
| 81 } | 127 } |
| 82 #endif | 128 #endif |
| 83 | 129 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 134 } | 180 } |
| 135 } | 181 } |
| 136 | 182 |
| 137 if (edges.size()) { | 183 if (edges.size()) { |
| 138 NOTREACHED() << "Dependency graph has a cycle. We are doomed."; | 184 NOTREACHED() << "Dependency graph has a cycle. We are doomed."; |
| 139 } | 185 } |
| 140 | 186 |
| 141 std::reverse(output.begin(), output.end()); | 187 std::reverse(output.begin(), output.end()); |
| 142 destruction_order_ = output; | 188 destruction_order_ = output; |
| 143 } | 189 } |
| OLD | NEW |