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

Unified Diff: tools/gn/setup.cc

Issue 56433003: GN threading refactor (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/gn/setup.h ('k') | tools/gn/target.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/setup.cc
diff --git a/tools/gn/setup.cc b/tools/gn/setup.cc
index ae02bf153b7e3a32b1f85259b3d23021b517bc80..4f18f57b35778358c62f0767d69b427bea082a2a 100644
--- a/tools/gn/setup.cc
+++ b/tools/gn/setup.cc
@@ -6,6 +6,7 @@
#include <stdlib.h>
+#include "base/bind.h"
#include "base/command_line.h"
#include "base/file_util.h"
#include "base/files/file_path.h"
@@ -141,17 +142,37 @@ base::FilePath ExtractDepotToolsFromPath() {
}
#endif
+// Called on any thread. Post the item to the builder on the main thread.
+void ItemDefinedCallback(base::MessageLoop* main_loop,
+ scoped_refptr<Builder> builder,
+ scoped_ptr<Item> item) {
+ DCHECK(item);
+ main_loop->PostTask(FROM_HERE, base::Bind(&Builder::ItemDefined, builder,
+ base::Passed(&item)));
+}
+
+void DecrementWorkCount() {
+ g_scheduler->DecrementWorkCount();
+}
+
} // namespace
// CommonSetup -----------------------------------------------------------------
CommonSetup::CommonSetup()
- : check_for_bad_items_(true) {
+ : build_settings_(),
+ loader_(new LoaderImpl(&build_settings_)),
+ builder_(new Builder(loader_.get())),
+ check_for_bad_items_(true) {
+ loader_->set_complete_callback(base::Bind(&DecrementWorkCount));
}
CommonSetup::CommonSetup(const CommonSetup& other)
: build_settings_(other.build_settings_),
+ loader_(new LoaderImpl(&build_settings_)),
+ builder_(new Builder(loader_.get())),
check_for_bad_items_(other.check_for_bad_items_) {
+ loader_->set_complete_callback(base::Bind(&DecrementWorkCount));
}
CommonSetup::~CommonSetup() {
@@ -159,15 +180,16 @@ CommonSetup::~CommonSetup() {
void CommonSetup::RunPreMessageLoop() {
// Load the root build file.
- build_settings_.toolchain_manager().StartLoadingUnlocked(
- SourceFile("//BUILD.gn"));
+ loader_->Load(SourceFile("//BUILD.gn"), Label());
+
+ // Will be decremented with the loader is drained.
+ g_scheduler->IncrementWorkCount();
}
bool CommonSetup::RunPostMessageLoop() {
Err err;
if (check_for_bad_items_) {
- err = build_settings_.item_tree().CheckForBadItems();
- if (err.has_error()) {
+ if (!builder_->CheckForBadItems(&err)) {
err.PrintToStdout();
return false;
}
@@ -195,6 +217,12 @@ Setup::Setup()
empty_settings_(&empty_build_settings_, std::string()),
dotfile_scope_(&empty_settings_) {
empty_settings_.set_toolchain_label(Label());
+ build_settings_.set_item_defined_callback(
+ base::Bind(&ItemDefinedCallback, scheduler_.main_loop(), builder_));
+
+ // The scheduler's main loop wasn't created when the Loader was created, so
+ // we need to set it now.
+ loader_->set_main_loop(scheduler_.main_loop());
}
Setup::~Setup() {
@@ -411,8 +439,11 @@ bool Setup::FillOtherConfig(const CommandLine& cmdline) {
// DependentSetup --------------------------------------------------------------
-DependentSetup::DependentSetup(const Setup& main_setup)
+DependentSetup::DependentSetup(Setup& main_setup)
: CommonSetup(main_setup) {
+ build_settings_.set_item_defined_callback(
+ base::Bind(&ItemDefinedCallback, main_setup.scheduler().main_loop(),
+ builder_));
}
DependentSetup::~DependentSetup() {
« no previous file with comments | « tools/gn/setup.h ('k') | tools/gn/target.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698