Index: tools/gn/command_gen.cc |
diff --git a/tools/gn/command_gen.cc b/tools/gn/command_gen.cc |
index 9f6d38f01afa62c3608ca75ba787de75a18ea29d..cde677a1443d01191210272d667f171a1f529177 100644 |
--- a/tools/gn/command_gen.cc |
+++ b/tools/gn/command_gen.cc |
@@ -22,10 +22,26 @@ namespace { |
// Suppress output on success. |
const char kSwitchQuiet[] = "q"; |
-void TargetResolvedCallback(base::subtle::Atomic32* write_counter, |
- const Target* target) { |
+void BackgroundDoWrite(const Target* target, const Toolchain* toolchain) { |
+ NinjaTargetWriter::RunAndWriteFile(target, toolchain); |
+ g_scheduler->DecrementWorkCount(); |
+} |
+ |
+// Called on the main thread. |
+void ItemResolvedCallback(base::subtle::Atomic32* write_counter, |
+ scoped_refptr<Builder> builder, |
+ const Item* item) { |
base::subtle::NoBarrier_AtomicIncrement(write_counter, 1); |
- NinjaTargetWriter::RunAndWriteFile(target); |
+ |
+ const Target* target = item->AsTarget(); |
+ if (target) { |
+ const Toolchain* toolchain = |
+ builder->GetToolchain(target->settings()->toolchain_label()); |
+ DCHECK(toolchain); |
+ g_scheduler->IncrementWorkCount(); |
+ g_scheduler->ScheduleWork( |
+ base::Bind(&BackgroundDoWrite, target, toolchain)); |
+ } |
} |
} // namespace |
@@ -51,15 +67,17 @@ int RunGen(const std::vector<std::string>& args) { |
// Cause the load to also generate the ninja files for each target. We wrap |
// the writing to maintain a counter. |
base::subtle::Atomic32 write_counter = 0; |
- setup->build_settings().set_target_resolved_callback( |
- base::Bind(&TargetResolvedCallback, &write_counter)); |
+ setup->builder()->set_resolved_callback( |
+ base::Bind(&ItemResolvedCallback, &write_counter, |
+ scoped_refptr<Builder>(setup->builder()))); |
// Do the actual load. This will also write out the target ninja files. |
if (!setup->Run()) |
return 1; |
// Write the root ninja files. |
- if (!NinjaWriter::RunAndWriteFiles(&setup->build_settings())) |
+ if (!NinjaWriter::RunAndWriteFiles(&setup->build_settings(), |
+ setup->builder())) |
return 1; |
base::TimeTicks end_time = base::TimeTicks::Now(); |