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

Unified Diff: services/catalog/reader.cc

Issue 2611183006: Service Manager: Miscellaneous catalog cleanup (Closed)
Patch Set: Created 3 years, 11 months 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 side-by-side diff with in-line comments
Download patch
Index: services/catalog/reader.cc
diff --git a/services/catalog/reader.cc b/services/catalog/reader.cc
index e435d171a26e528f7190ec32c760bdd2d401dc36..39aac75d7a092dfe428895fa0459bab4b4464694 100644
--- a/services/catalog/reader.cc
+++ b/services/catalog/reader.cc
@@ -19,6 +19,7 @@
#include "base/values.h"
#include "services/catalog/constants.h"
#include "services/catalog/entry.h"
+#include "services/catalog/entry_cache.h"
#include "services/catalog/manifest_provider.h"
#include "services/catalog/public/interfaces/constants.mojom.h"
#include "services/service_manager/public/interfaces/constants.mojom.h"
@@ -152,14 +153,8 @@ std::unique_ptr<Entry> ReadManifest(
return entry;
}
-void AddEntryToCache(EntryCache* cache, std::unique_ptr<Entry> entry) {
- std::vector<std::unique_ptr<Entry>> children = entry->TakeChildren();
- for (auto& child : children)
- AddEntryToCache(cache, std::move(child));
- (*cache)[entry->name()] = std::move(entry);
-}
-
-void DoNothing(service_manager::mojom::ResolveResultPtr) {}
+void IgnoreResolveResult(service_manager::mojom::ResolveResultPtr,
+ service_manager::mojom::ResolveResultPtr) {}
void LoadCatalogManifestIntoCache(const base::Value* root,
const base::FilePath& package_dir,
@@ -222,10 +217,12 @@ void LoadCatalogManifestIntoCache(const base::Value* root,
auto entry = ProcessManifest(
manifest, is_embedded ? base::FilePath() : package_dir,
executable_path);
- if (entry)
- AddEntryToCache(cache, std::move(entry));
- else
+ if (entry) {
+ bool added = cache->AddRootEntry(std::move(entry));
+ DCHECK(added);
+ } else {
LOG(ERROR) << "Failed to read manifest entry for \"" << it.key() << "\".";
+ }
}
}
@@ -268,18 +265,18 @@ void Reader::Read(const base::FilePath& package_dir,
FROM_HERE,
base::Bind(&ScanDir, package_dir,
base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(),
- cache, base::Bind(&DoNothing)),
+ cache, base::Bind(&IgnoreResolveResult)),
base::ThreadTaskRunnerHandle::Get(),
read_complete_closure));
}
void Reader::CreateEntryForName(
- const std::string& mojo_name,
+ const std::string& name,
EntryCache* cache,
const CreateEntryForNameCallback& entry_created_callback) {
if (manifest_provider_) {
std::unique_ptr<base::Value> manifest_root =
- manifest_provider_->GetManifest(mojo_name);
+ manifest_provider_->GetManifest(name);
if (manifest_root) {
base::PostTaskAndReplyWithResult(
file_task_runner_.get(), FROM_HERE,
@@ -292,26 +289,27 @@ void Reader::CreateEntryForName(
} else if (using_static_catalog_) {
// A Reader using a static catalog manifest does not support dynamic
// discovery or introduction of new catalog entries.
- entry_created_callback.Run(service_manager::mojom::ResolveResultPtr());
+ entry_created_callback.Run(service_manager::mojom::ResolveResultPtr(),
+ service_manager::mojom::ResolveResultPtr());
return;
}
base::FilePath manifest_path_override;
{
- auto override_iter = manifest_path_overrides_.find(mojo_name);
+ auto override_iter = manifest_path_overrides_.find(name);
if (override_iter != manifest_path_overrides_.end())
manifest_path_override = override_iter->second;
}
std::string package_name_override;
{
- auto override_iter = package_name_overrides_.find(mojo_name);
+ auto override_iter = package_name_overrides_.find(name);
if (override_iter != package_name_overrides_.end())
package_name_override = override_iter->second;
}
base::PostTaskAndReplyWithResult(
file_task_runner_.get(), FROM_HERE,
- base::Bind(&ReadManifest, system_package_dir_, mojo_name,
+ base::Bind(&ReadManifest, system_package_dir_, name,
package_name_override, manifest_path_override),
base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), cache,
entry_created_callback));
@@ -340,10 +338,19 @@ void Reader::OnReadManifest(
std::unique_ptr<Entry> entry) {
if (!entry)
return;
- service_manager::mojom::ResolveResultPtr result =
- service_manager::mojom::ResolveResult::From(*entry);
- AddEntryToCache(cache, std::move(entry));
- entry_created_callback.Run(std::move(result));
+
+ std::string name = entry->name();
+ cache->AddRootEntry(std::move(entry));
+
+ // NOTE: It's currently possible to end up with a duplicate entry, in which
+ // case the above call to AddRootEntry() may actually discard |entry|. We
+ // therefore look up the Entry by name here to get resolution metadata.
+
+ const Entry* resolved_entry = cache->GetEntry(name);
+ DCHECK(resolved_entry);
+ entry_created_callback.Run(
+ service_manager::mojom::ResolveResult::From(resolved_entry),
+ service_manager::mojom::ResolveResult::From(resolved_entry->parent()));
}
} // namespace catalog

Powered by Google App Engine
This is Rietveld 408576698