From 5d89f5f125363c2a123da48581edfbe21f84ed66 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 28 Nov 2021 13:36:50 -0800 Subject: [PATCH 01/28] Update task_state.h --- buildcc/lib/env/include/env/task_state.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildcc/lib/env/include/env/task_state.h b/buildcc/lib/env/include/env/task_state.h index febb3cae..0dec0222 100644 --- a/buildcc/lib/env/include/env/task_state.h +++ b/buildcc/lib/env/include/env/task_state.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ENV_PRIVATE_TASK_STATE_H_ -#define ENV_PRIVATE_TASK_STATE_H_ +#ifndef ENV_TASK_STATE_H_ +#define ENV_TASK_STATE_H_ namespace buildcc::env { From b14e14c815acb027a364c7ee58a383afee4aeecd Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 28 Nov 2021 13:46:35 -0800 Subject: [PATCH 02/28] Added assert_throw --- buildcc/lib/env/CMakeLists.txt | 1 + buildcc/lib/env/include/env/assert_throw.h | 60 ++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 buildcc/lib/env/include/env/assert_throw.h diff --git a/buildcc/lib/env/CMakeLists.txt b/buildcc/lib/env/CMakeLists.txt index 54f7f833..3ac8bd21 100644 --- a/buildcc/lib/env/CMakeLists.txt +++ b/buildcc/lib/env/CMakeLists.txt @@ -37,6 +37,7 @@ set(ENV_SRCS src/assert_fatal.cpp src/logging.cpp include/env/assert_fatal.h + include/env/assert_throw.h include/env/env.h include/env/logging.h include/env/host_os.h diff --git a/buildcc/lib/env/include/env/assert_throw.h b/buildcc/lib/env/include/env/assert_throw.h new file mode 100644 index 00000000..951a3c69 --- /dev/null +++ b/buildcc/lib/env/include/env/assert_throw.h @@ -0,0 +1,60 @@ +/* + * Copyright 2021 Niket Naidu. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ENV_ASSERT_THROW_H_ +#define ENV_ASSERT_THROW_H_ + +#include + +namespace buildcc::env { + +/** + * @brief Compile time expr asserts fatally when false + */ +template inline void assert_throw(const char *message) { + if constexpr (!expr) { + env::log_critical("assert", message); + // TODO, If needed specialize this + throw std::exception(); + } +} + +/** + * @brief Compile time expr asserts fatally when false + */ +template inline void assert_throw(const std::string &message) { + assert_throw(message.c_str()); +} + +/** + * @brief Runtime expr asserts fatally when false + */ +inline void assert_throw(bool expression, const char *message) { + if (!expression) { + assert_throw(message); + } +} + +/** + * @brief Runtime expr asserts fatally when false + */ +inline void assert_throw(bool expression, const std::string &message) { + assert_throw(expression, message.c_str()); +} + +} // namespace buildcc::env + +#endif From 31602bceaa48af9211a56f1ca9ea482445e708d0 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 28 Nov 2021 14:07:10 -0800 Subject: [PATCH 03/28] Update path.h --- buildcc/lib/target/include/target/common/path.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/buildcc/lib/target/include/target/common/path.h b/buildcc/lib/target/include/target/common/path.h index 24a32c43..7d35e851 100644 --- a/buildcc/lib/target/include/target/common/path.h +++ b/buildcc/lib/target/include/target/common/path.h @@ -43,12 +43,14 @@ class Path { * @param pathname * @return Path */ + // TODO, Discuss if we should return `std::optional` instead of asserting static Path CreateExistingPath(const fs::path &pathname) { std::error_code errcode; uint64_t last_write_timestamp = std::filesystem::last_write_time(pathname, errcode) .time_since_epoch() .count(); + // TODO, Discuss if we should replace this with `env::assert_throw` env::assert_fatal(errcode.value() == 0, fmt::format("{} not found", pathname)); @@ -160,6 +162,10 @@ struct RelationalPathFiles { RelationalPathFiles(const path_unordered_set &i, const fs_unordered_set &u) : internal(i), user(u) {} + /** + * @brief Convert from fs_unordered_set to path_unordered_set + * Can assert fatal if file does not exist when calling `CreateExistingPath` + */ void Convert() { if (done_once) { return; From 320976b287bb9bd7d1932bda6ead6ad818ca0b7d Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 28 Nov 2021 14:14:30 -0800 Subject: [PATCH 04/28] Updated Getter APIs --- buildcc/lib/target/include/target/base/generator_loader.h | 6 +++--- .../lib/target/include/target/interface/loader_interface.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/buildcc/lib/target/include/target/base/generator_loader.h b/buildcc/lib/target/include/target/base/generator_loader.h index bce26f2b..bc9b22ee 100644 --- a/buildcc/lib/target/include/target/base/generator_loader.h +++ b/buildcc/lib/target/include/target/base/generator_loader.h @@ -41,15 +41,15 @@ class GeneratorLoader : public LoaderInterface { bool Load() override; // Getters - const internal::path_unordered_set &GetLoadedInputFiles() const { + const internal::path_unordered_set &GetLoadedInputFiles() const noexcept { return loaded_input_files_; } - const internal::fs_unordered_set &GetLoadedOutputFiles() const { + const internal::fs_unordered_set &GetLoadedOutputFiles() const noexcept { return loaded_output_files_; } - const std::vector &GetLoadedCommands() const { + const std::vector &GetLoadedCommands() const noexcept { return loaded_commands_; } diff --git a/buildcc/lib/target/include/target/interface/loader_interface.h b/buildcc/lib/target/include/target/interface/loader_interface.h index 4196b221..fb085bfa 100644 --- a/buildcc/lib/target/include/target/interface/loader_interface.h +++ b/buildcc/lib/target/include/target/interface/loader_interface.h @@ -28,7 +28,7 @@ class LoaderInterface { virtual bool Load() = 0; const fs::path &GetBinaryPath() const { return binary_path_; }; - bool IsLoaded() const { return loaded_; }; + bool IsLoaded() const noexcept { return loaded_; }; protected: bool loaded_{false}; From f9e6a803ec13c59d5c4890b379e1522ef536f4dd Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 28 Nov 2021 20:32:47 -0800 Subject: [PATCH 05/28] Update path.h --- buildcc/lib/target/include/target/common/path.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/buildcc/lib/target/include/target/common/path.h b/buildcc/lib/target/include/target/common/path.h index 7d35e851..ca939768 100644 --- a/buildcc/lib/target/include/target/common/path.h +++ b/buildcc/lib/target/include/target/common/path.h @@ -24,7 +24,7 @@ #include // Env -#include "env/assert_fatal.h" +#include "env/assert_throw.h" // Third party #include "fmt/format.h" @@ -50,8 +50,7 @@ class Path { std::filesystem::last_write_time(pathname, errcode) .time_since_epoch() .count(); - // TODO, Discuss if we should replace this with `env::assert_throw` - env::assert_fatal(errcode.value() == 0, + env::assert_throw(errcode.value() == 0, fmt::format("{} not found", pathname)); return Path(pathname, last_write_timestamp); @@ -164,7 +163,7 @@ struct RelationalPathFiles { /** * @brief Convert from fs_unordered_set to path_unordered_set - * Can assert fatal if file does not exist when calling `CreateExistingPath` + * Can assert throw if file does not exist when calling `CreateExistingPath` */ void Convert() { if (done_once) { From 3a6b3140f04ea9ec50bcfbf5f043020635a72467 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 28 Nov 2021 20:34:26 -0800 Subject: [PATCH 06/28] Update assert_throw.h --- buildcc/lib/env/include/env/assert_throw.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/buildcc/lib/env/include/env/assert_throw.h b/buildcc/lib/env/include/env/assert_throw.h index 951a3c69..88147ae2 100644 --- a/buildcc/lib/env/include/env/assert_throw.h +++ b/buildcc/lib/env/include/env/assert_throw.h @@ -19,6 +19,8 @@ #include +#include "logging.h" + namespace buildcc::env { /** From edea718d0ca659ee8ea71818018a3dee426d644e Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 28 Nov 2021 20:40:44 -0800 Subject: [PATCH 07/28] Updated header files with assert_fatal --- buildcc/lib/target/include/target/interface/builder_interface.h | 2 ++ buildcc/lib/target/src/api/sync_api.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/buildcc/lib/target/include/target/interface/builder_interface.h b/buildcc/lib/target/include/target/interface/builder_interface.h index f91da00f..f0384986 100644 --- a/buildcc/lib/target/include/target/interface/builder_interface.h +++ b/buildcc/lib/target/include/target/interface/builder_interface.h @@ -21,6 +21,8 @@ #include #include +#include "env/assert_fatal.h" + #include "target/common/path.h" #include "target/common/util.h" diff --git a/buildcc/lib/target/src/api/sync_api.cpp b/buildcc/lib/target/src/api/sync_api.cpp index a24d08da..99b06407 100644 --- a/buildcc/lib/target/src/api/sync_api.cpp +++ b/buildcc/lib/target/src/api/sync_api.cpp @@ -18,6 +18,8 @@ #include "target/target_info.h" +#include "env/assert_fatal.h" + namespace buildcc::base { template From b9d3d5f17a82dc127c1238d495b6f2eebd4e687e Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 28 Nov 2021 20:48:14 -0800 Subject: [PATCH 08/28] Update assert_throw.h --- buildcc/lib/env/include/env/assert_throw.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/buildcc/lib/env/include/env/assert_throw.h b/buildcc/lib/env/include/env/assert_throw.h index 88147ae2..794dcd77 100644 --- a/buildcc/lib/env/include/env/assert_throw.h +++ b/buildcc/lib/env/include/env/assert_throw.h @@ -59,4 +59,10 @@ inline void assert_throw(bool expression, const std::string &message) { } // namespace buildcc::env +/** + * @brief Runtime expr asserts fatally when false + */ +#define ASSERT_THROW(expr, message) \ + ((expr) ? static_cast(0) : buildcc::env::assert_throw(message)) + #endif From e94a69101d71dc51a6f8c64256ccf5ec44ab77ae Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 28 Nov 2021 20:49:17 -0800 Subject: [PATCH 09/28] Update assert_throw.h --- buildcc/lib/env/include/env/assert_throw.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildcc/lib/env/include/env/assert_throw.h b/buildcc/lib/env/include/env/assert_throw.h index 794dcd77..bdb5618b 100644 --- a/buildcc/lib/env/include/env/assert_throw.h +++ b/buildcc/lib/env/include/env/assert_throw.h @@ -60,7 +60,7 @@ inline void assert_throw(bool expression, const std::string &message) { } // namespace buildcc::env /** - * @brief Runtime expr asserts fatally when false + * @brief Runtime expr assert throws when false */ #define ASSERT_THROW(expr, message) \ ((expr) ? static_cast(0) : buildcc::env::assert_throw(message)) From cc1b063fc2938d676c2be91ec78b7aacdf199047 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 28 Nov 2021 21:07:43 -0800 Subject: [PATCH 10/28] Updated test_generator with mock/task.cpp --- buildcc/lib/target/cmake/mock_target.cmake | 2 +- buildcc/lib/target/test/target/test_generator.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/buildcc/lib/target/cmake/mock_target.cmake b/buildcc/lib/target/cmake/mock_target.cmake index 5de474ec..b3735e46 100644 --- a/buildcc/lib/target/cmake/mock_target.cmake +++ b/buildcc/lib/target/cmake/mock_target.cmake @@ -2,7 +2,7 @@ add_library(mock_target STATIC ${COMMON_TARGET_SRCS} # Generator mocks - mock/generator/task.cpp + src/generator/task.cpp mock/generator/runner.cpp mock/generator/recheck_states.cpp diff --git a/buildcc/lib/target/test/target/test_generator.cpp b/buildcc/lib/target/test/target/test_generator.cpp index 915e7030..6363ecf9 100644 --- a/buildcc/lib/target/test/target/test_generator.cpp +++ b/buildcc/lib/target/test/target/test_generator.cpp @@ -42,6 +42,7 @@ TEST(GeneratorTestGroup, Generator_Build) { buildcc::m::CommandExpect_Execute(1, true); generator.Build(); + buildcc::base::m::GeneratorRunner(generator); mock().checkExpectations(); } @@ -60,6 +61,7 @@ TEST(GeneratorTestGroup, Generator_Identifier) { buildcc::m::CommandExpect_Execute(1, true); generator.Build(); + buildcc::base::m::GeneratorRunner(generator); mock().checkExpectations(); } @@ -78,6 +80,7 @@ TEST(GeneratorTestGroup, Generator_Rebuild) { buildcc::m::CommandExpect_Execute(1, true); generator.Build(); + buildcc::base::m::GeneratorRunner(generator); } { @@ -91,6 +94,7 @@ TEST(GeneratorTestGroup, Generator_Rebuild) { }); generator.Build(); + buildcc::base::m::GeneratorRunner(generator); } mock().checkExpectations(); @@ -108,6 +112,7 @@ TEST(GeneratorTestGroup, Generator_Rebuild_Inputs) { buildcc::m::CommandExpect_Execute(1, true); generator.Build(); + buildcc::base::m::GeneratorRunner(generator); } // Removed @@ -120,6 +125,7 @@ TEST(GeneratorTestGroup, Generator_Rebuild_Inputs) { buildcc::base::m::GeneratorExpect_InputRemoved(1, &generator); buildcc::m::CommandExpect_Execute(1, true); generator.Build(); + buildcc::base::m::GeneratorRunner(generator); } // Added @@ -133,6 +139,7 @@ TEST(GeneratorTestGroup, Generator_Rebuild_Inputs) { buildcc::base::m::GeneratorExpect_InputAdded(1, &generator); buildcc::m::CommandExpect_Execute(1, true); generator.Build(); + buildcc::base::m::GeneratorRunner(generator); } sleep(1); @@ -153,6 +160,7 @@ TEST(GeneratorTestGroup, Generator_Rebuild_Inputs) { buildcc::base::m::GeneratorExpect_InputUpdated(1, &generator); buildcc::m::CommandExpect_Execute(1, true); generator.Build(); + buildcc::base::m::GeneratorRunner(generator); } mock().checkExpectations(); @@ -172,6 +180,7 @@ TEST(GeneratorTestGroup, Generator_Rebuild_Outputs) { buildcc::m::CommandExpect_Execute(1, true); generator.Build(); + buildcc::base::m::GeneratorRunner(generator); } { @@ -186,6 +195,7 @@ TEST(GeneratorTestGroup, Generator_Rebuild_Outputs) { buildcc::base::m::GeneratorExpect_OutputChanged(1, &generator); buildcc::m::CommandExpect_Execute(1, true); generator.Build(); + buildcc::base::m::GeneratorRunner(generator); } { @@ -201,6 +211,7 @@ TEST(GeneratorTestGroup, Generator_Rebuild_Outputs) { buildcc::base::m::GeneratorExpect_OutputChanged(1, &generator); buildcc::m::CommandExpect_Execute(1, true); generator.Build(); + buildcc::base::m::GeneratorRunner(generator); } mock().checkExpectations(); @@ -220,6 +231,7 @@ TEST(GeneratorTestGroup, Generator_Rebuild_Commands) { buildcc::m::CommandExpect_Execute(1, true); generator.Build(); + buildcc::base::m::GeneratorRunner(generator); } { @@ -234,6 +246,7 @@ TEST(GeneratorTestGroup, Generator_Rebuild_Commands) { buildcc::base::m::GeneratorExpect_CommandChanged(1, &generator); buildcc::m::CommandExpect_Execute(1, true); generator.Build(); + buildcc::base::m::GeneratorRunner(generator); } { @@ -246,6 +259,7 @@ TEST(GeneratorTestGroup, Generator_Rebuild_Commands) { buildcc::base::m::GeneratorExpect_CommandChanged(1, &generator); buildcc::m::CommandExpect_Execute(1, true); generator.Build(); + buildcc::base::m::GeneratorRunner(generator); } mock().checkExpectations(); From 08f49f2314a456cf3f6d61806e7248dd324f8987 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 28 Nov 2021 21:08:13 -0800 Subject: [PATCH 11/28] Delete mock/generaetor/task.cpp --- buildcc/lib/target/mock/generator/task.cpp | 36 ---------------------- 1 file changed, 36 deletions(-) delete mode 100644 buildcc/lib/target/mock/generator/task.cpp diff --git a/buildcc/lib/target/mock/generator/task.cpp b/buildcc/lib/target/mock/generator/task.cpp deleted file mode 100644 index 6e48fcf0..00000000 --- a/buildcc/lib/target/mock/generator/task.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "target/generator.h" - -#include "env/util.h" - -#include "command/command.h" - -namespace buildcc::base { - -void Generator::GenerateTask() { - Convert(); - BuildGenerate(); - - if (!dirty_) { - return; - } - - // NOTE, info->parallel is not checked - // Run the command - for (const auto &command : current_commands_) { - bool success = Command::Execute(command); - env::assert_fatal(success, fmt::format("{} failed", command)); - } - - // Generate the output file - for (const auto &output_file : current_output_files_) { - std::string file = path_as_string(output_file); - bool success = env::save_file(file.c_str(), "", false); - env::assert_fatal(success, fmt::format("{} failed", file)); - } - - if (dirty_) { - env::assert_fatal(Store(), fmt::format("Store failed for {}", name_)); - } -} - -} // namespace buildcc::base From 773d42a4885880349146e6cbf65c040a8b69b0bd Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 28 Nov 2021 23:40:32 -0800 Subject: [PATCH 12/28] Updated generator.h and generator/task.cpp with env::TaskState --- buildcc/lib/target/include/target/generator.h | 2 + buildcc/lib/target/src/generator/task.cpp | 41 ++++++++++++------- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/buildcc/lib/target/include/target/generator.h b/buildcc/lib/target/include/target/generator.h index 97305f7d..104a7704 100644 --- a/buildcc/lib/target/include/target/generator.h +++ b/buildcc/lib/target/include/target/generator.h @@ -25,6 +25,7 @@ #include "taskflow/taskflow.hpp" #include "env/env.h" +#include "env/task_state.h" #include "command/command.h" @@ -132,6 +133,7 @@ class Generator : public BuilderInterface { bool parallel_{false}; // Internal + env::TaskState task_state_{env::TaskState::SUCCESS}; Command command_; tf::Taskflow tf_; }; diff --git a/buildcc/lib/target/src/generator/task.cpp b/buildcc/lib/target/src/generator/task.cpp index 10feeea5..c75b450f 100644 --- a/buildcc/lib/target/src/generator/task.cpp +++ b/buildcc/lib/target/src/generator/task.cpp @@ -20,30 +20,29 @@ namespace { constexpr const char *const kCommandTaskName = "Command"; -constexpr const char *const kPreGenerateTaskName = "PreGenerate"; constexpr const char *const kGenerateTaskName = "Generate"; -constexpr const char *const kPostGenerateTaskName = "PostGenerate"; } // namespace namespace buildcc::base { void Generator::GenerateTask() { - - tf::Task pregenerate_task = tf_.emplace([this]() { - Convert(); - BuildGenerate(); - }); - pregenerate_task.name(kPreGenerateTaskName); - - tf::Task postgenerate_task = tf_.emplace([this]() { - if (dirty_) { - env::assert_fatal(Store(), fmt::format("Store failed for {}", name_)); + tf::Task start_task = tf_.emplace([this]() { + switch (env::get_task_state()) { + case env::TaskState::SUCCESS: + break; + default: + task_state_ = env::TaskState::FAILURE; + break; } + return static_cast(task_state_); }); - postgenerate_task.name(kPostGenerateTaskName); + start_task.name("Start Generator"); tf::Task generate_task = tf_.emplace([&](tf::Subflow &subflow) { + Convert(); + BuildGenerate(); + tf::Task command_task; if (dirty_) { if (parallel_) { @@ -66,6 +65,7 @@ void Generator::GenerateTask() { } command_task.name(kCommandTaskName); + // Graph Generation for (const auto &i : current_input_files_.user) { std::string name = fmt::format("{}", i.lexically_relative(env::get_project_root_dir())); @@ -82,8 +82,19 @@ void Generator::GenerateTask() { }); generate_task.name(kGenerateTaskName); - pregenerate_task.precede(generate_task); - generate_task.precede(postgenerate_task); + tf::Task end_task = tf_.emplace([this]() { + // TODO, Update the Store API + if (dirty_) { + env::assert_fatal(Store(), fmt::format("Store failed for {}", name_)); + } + + // TODO, Update if failure + }); + end_task.name("End Generator"); + + // Dependencies + start_task.precede(generate_task, end_task); + generate_task.precede(end_task); } } // namespace buildcc::base From 1a7f543d4caecec8f041bd80380841d9841da43c Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Sun, 28 Nov 2021 23:54:48 -0800 Subject: [PATCH 13/28] Update task.cpp --- buildcc/lib/target/src/generator/task.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/buildcc/lib/target/src/generator/task.cpp b/buildcc/lib/target/src/generator/task.cpp index c75b450f..1622edee 100644 --- a/buildcc/lib/target/src/generator/task.cpp +++ b/buildcc/lib/target/src/generator/task.cpp @@ -19,6 +19,9 @@ #include "command/command.h" namespace { +constexpr const char *const kStartGeneratorTaskName = "Start Generator"; +constexpr const char *const kEndGeneratorTaskName = "End Generator"; + constexpr const char *const kCommandTaskName = "Command"; constexpr const char *const kGenerateTaskName = "Generate"; @@ -33,11 +36,14 @@ void Generator::GenerateTask() { break; default: task_state_ = env::TaskState::FAILURE; + // Update input path for failure + // NOTE, Nothing changes + current_input_files_.internal = loader_.GetLoadedInputFiles(); break; } return static_cast(task_state_); }); - start_task.name("Start Generator"); + start_task.name(kStartGeneratorTaskName); tf::Task generate_task = tf_.emplace([&](tf::Subflow &subflow) { Convert(); @@ -90,7 +96,7 @@ void Generator::GenerateTask() { // TODO, Update if failure }); - end_task.name("End Generator"); + end_task.name(kEndGeneratorTaskName); // Dependencies start_task.precede(generate_task, end_task); From 0ca98594447bcf228223faa247afcaf45b44a08b Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 29 Nov 2021 00:00:38 -0800 Subject: [PATCH 14/28] Update task.cpp --- buildcc/lib/target/src/generator/task.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/buildcc/lib/target/src/generator/task.cpp b/buildcc/lib/target/src/generator/task.cpp index 1622edee..c5d7db24 100644 --- a/buildcc/lib/target/src/generator/task.cpp +++ b/buildcc/lib/target/src/generator/task.cpp @@ -49,20 +49,20 @@ void Generator::GenerateTask() { Convert(); BuildGenerate(); + auto run_command = [](const std::string &command) { + bool success = Command::Execute(command); + env::assert_fatal(success, fmt::format("{} failed", command)); + }; + tf::Task command_task; if (dirty_) { if (parallel_) { - command_task = subflow.for_each( - current_commands_.cbegin(), current_commands_.cend(), - [](const std::string &command) { - bool success = Command::Execute(command); - env::assert_fatal(success, fmt::format("{} failed", command)); - }); + command_task = subflow.for_each(current_commands_.cbegin(), + current_commands_.cend(), run_command); } else { command_task = subflow.emplace([&]() { for (const auto &command : current_commands_) { - bool success = Command::Execute(command); - env::assert_fatal(success, fmt::format("{} failed", command)); + run_command(command); } }); } From 47a40641cb657e7461f5b71c8d7e3d65422e8767 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 29 Nov 2021 00:16:21 -0800 Subject: [PATCH 15/28] Update task_state.cpp --- buildcc/lib/env/src/task_state.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/buildcc/lib/env/src/task_state.cpp b/buildcc/lib/env/src/task_state.cpp index 787bbb3b..93f14d45 100644 --- a/buildcc/lib/env/src/task_state.cpp +++ b/buildcc/lib/env/src/task_state.cpp @@ -28,6 +28,10 @@ buildcc::env::TaskState current_state{buildcc::env::TaskState::SUCCESS}; namespace buildcc::env { void set_task_state(TaskState state) { + // NOTE, `Avoid resetting` if same state is provided + if (state == get_task_state()) { + return; + } std::lock_guard guard(current_state_mutex); current_state = state; } From 480a6adc3ee6a6e21dc0ee52e82d0266abb3ac58 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 29 Nov 2021 00:16:34 -0800 Subject: [PATCH 16/28] Update task.cpp --- buildcc/lib/target/src/generator/task.cpp | 33 ++++++++++++++++------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/buildcc/lib/target/src/generator/task.cpp b/buildcc/lib/target/src/generator/task.cpp index c5d7db24..6293f94b 100644 --- a/buildcc/lib/target/src/generator/task.cpp +++ b/buildcc/lib/target/src/generator/task.cpp @@ -36,9 +36,6 @@ void Generator::GenerateTask() { break; default: task_state_ = env::TaskState::FAILURE; - // Update input path for failure - // NOTE, Nothing changes - current_input_files_.internal = loader_.GetLoadedInputFiles(); break; } return static_cast(task_state_); @@ -49,9 +46,13 @@ void Generator::GenerateTask() { Convert(); BuildGenerate(); - auto run_command = [](const std::string &command) { - bool success = Command::Execute(command); - env::assert_fatal(success, fmt::format("{} failed", command)); + auto run_command = [this](const std::string &command) { + try { + bool success = Command::Execute(command); + env::assert_throw(success, fmt::format("{} failed", command)); + } catch (const std::exception &e) { + task_state_ = env::TaskState::FAILURE; + } }; tf::Task command_task; @@ -89,12 +90,26 @@ void Generator::GenerateTask() { generate_task.name(kGenerateTaskName); tf::Task end_task = tf_.emplace([this]() { - // TODO, Update the Store API + // Set the current schema parameters to the old parameters + if (task_state_ != env::TaskState::SUCCESS) { + current_input_files_.internal = loader_.GetLoadedInputFiles(); + current_output_files_ = loader_.GetLoadedOutputFiles(); + current_commands_ = loader_.GetLoadedCommands(); + dirty_ = true; + } + if (dirty_) { - env::assert_fatal(Store(), fmt::format("Store failed for {}", name_)); + try { + env::assert_throw(Store(), fmt::format("Store failed for {}", name_)); + } catch (const std::exception &e) { + task_state_ = env::TaskState::FAILURE; + } } - // TODO, Update if failure + // Update Env task state when NOT SUCCESS only + if (task_state_ != env::TaskState::SUCCESS) { + env::set_task_state(task_state_); + } }); end_task.name(kEndGeneratorTaskName); From 1cc3e8e32892399e42a732f09fe44547b69e722a Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 29 Nov 2021 00:26:27 -0800 Subject: [PATCH 17/28] Update task.cpp --- buildcc/lib/target/src/generator/task.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/buildcc/lib/target/src/generator/task.cpp b/buildcc/lib/target/src/generator/task.cpp index 6293f94b..7a165079 100644 --- a/buildcc/lib/target/src/generator/task.cpp +++ b/buildcc/lib/target/src/generator/task.cpp @@ -90,15 +90,13 @@ void Generator::GenerateTask() { generate_task.name(kGenerateTaskName); tf::Task end_task = tf_.emplace([this]() { - // Set the current schema parameters to the old parameters - if (task_state_ != env::TaskState::SUCCESS) { - current_input_files_.internal = loader_.GetLoadedInputFiles(); - current_output_files_ = loader_.GetLoadedOutputFiles(); - current_commands_ = loader_.GetLoadedCommands(); - dirty_ = true; - } + // task_state_ != env::TaskState::SUCCESS + // We do not need to Store, leave the serialized store with the previous + // values - if (dirty_) { + // NOTE, Only store if the above state is marked dirty_ AND task_state_ == + // SUCCESS + if (dirty_ && (task_state_ == env::TaskState::SUCCESS)) { try { env::assert_throw(Store(), fmt::format("Store failed for {}", name_)); } catch (const std::exception &e) { From bda7f100bae6c58497dc21593d98c2b6cfe73d4e Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 29 Nov 2021 00:31:25 -0800 Subject: [PATCH 18/28] Update test_generator.cpp --- .../lib/target/test/target/test_generator.cpp | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/buildcc/lib/target/test/target/test_generator.cpp b/buildcc/lib/target/test/target/test_generator.cpp index 6363ecf9..27891d5b 100644 --- a/buildcc/lib/target/test/target/test_generator.cpp +++ b/buildcc/lib/target/test/target/test_generator.cpp @@ -47,6 +47,26 @@ TEST(GeneratorTestGroup, Generator_Build) { mock().checkExpectations(); } +TEST(GeneratorTestGroup, Generator_BuildParallel) { + constexpr const char *const NAME = "BuildParallel"; + buildcc::base::Generator generator(NAME, "", true); + + generator.AddDefaultArguments({ + {"compiler", "gcc"}, + }); + + generator.AddInput("{gen_root_dir}/dummy_main.c"); + generator.AddOutput("{gen_build_dir}/dummy_main.exe"); + generator.AddCommand("{compiler} -o {gen_build_dir}/dummy_main.exe " + "{gen_root_dir}/dummy_main.c"); + + buildcc::m::CommandExpect_Execute(1, true); + generator.Build(); + buildcc::base::m::GeneratorRunner(generator); + + mock().checkExpectations(); +} + TEST(GeneratorTestGroup, Generator_Identifier) { constexpr const char *const NAME = "Identifier"; buildcc::base::Generator generator(NAME, ""); @@ -277,6 +297,32 @@ TEST(GeneratorTestGroup, Generator_AddDefaultArguments) { STRCMP_EQUAL(generator.GetName().c_str(), "AddDefaultArgument"); } +// FAILURE STATES + +TEST(GeneratorTestGroup, Generator_FailedEnvTaskState) { + buildcc::env::set_task_state(buildcc::env::TaskState::FAILURE); + + constexpr const char *const NAME = "FailedEnvTaskState"; + buildcc::base::Generator generator(NAME, "", true); + + generator.AddDefaultArguments({ + {"compiler", "gcc"}, + }); + + generator.AddInput("{gen_root_dir}/dummy_main.c"); + generator.AddOutput("{gen_build_dir}/dummy_main.exe"); + generator.AddCommand("{compiler} -o {gen_build_dir}/dummy_main.exe " + "{gen_root_dir}/dummy_main.c"); + + // buildcc::m::CommandExpect_Execute(1, true); + generator.Build(); + buildcc::base::m::GeneratorRunner(generator); + + mock().checkExpectations(); + + buildcc::env::set_task_state(buildcc::env::TaskState::SUCCESS); +} + int main(int ac, char **av) { fs::remove_all(BUILD_DIR); buildcc::env::init(fs::current_path() / "data", BUILD_DIR); From 049b111efca1b310ee503af0b5c924304b3e1186 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 29 Nov 2021 00:35:57 -0800 Subject: [PATCH 19/28] Update path.h --- buildcc/lib/target/include/target/common/path.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/buildcc/lib/target/include/target/common/path.h b/buildcc/lib/target/include/target/common/path.h index ca939768..638c531a 100644 --- a/buildcc/lib/target/include/target/common/path.h +++ b/buildcc/lib/target/include/target/common/path.h @@ -67,13 +67,15 @@ class Path { * @param pathname * @return Path */ - static Path CreateNewPath(const fs::path &pathname) noexcept { + static Path CreateNewPath(const fs::path &pathname) { return Path(pathname, 0); } // Getters - std::uint64_t GetLastWriteTimestamp() const { return last_write_timestamp_; } - const fs::path &GetPathname() const { return pathname_; } + std::uint64_t GetLastWriteTimestamp() const noexcept { + return last_write_timestamp_; + } + const fs::path &GetPathname() const noexcept { return pathname_; } /** * @brief Get fs::path as std::string while keeping the preferred os From ea007db817dd4dbd44da5177677d03affd48f3c0 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 29 Nov 2021 00:48:24 -0800 Subject: [PATCH 20/28] Update task.cpp --- buildcc/lib/target/src/generator/task.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/buildcc/lib/target/src/generator/task.cpp b/buildcc/lib/target/src/generator/task.cpp index 7a165079..35c6e7ef 100644 --- a/buildcc/lib/target/src/generator/task.cpp +++ b/buildcc/lib/target/src/generator/task.cpp @@ -43,8 +43,12 @@ void Generator::GenerateTask() { start_task.name(kStartGeneratorTaskName); tf::Task generate_task = tf_.emplace([&](tf::Subflow &subflow) { - Convert(); - BuildGenerate(); + try { + Convert(); + BuildGenerate(); + } catch (const std::exception &e) { + task_state_ = env::TaskState::FAILURE; + } auto run_command = [this](const std::string &command) { try { @@ -56,7 +60,7 @@ void Generator::GenerateTask() { }; tf::Task command_task; - if (dirty_) { + if (dirty_ && (task_state_ == env::TaskState::SUCCESS)) { if (parallel_) { command_task = subflow.for_each(current_commands_.cbegin(), current_commands_.cend(), run_command); From cd7cbf6f3329403da0c26b9bf313552b6a3d8b6f Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 29 Nov 2021 00:48:28 -0800 Subject: [PATCH 21/28] Update test_generator.cpp --- .../lib/target/test/target/test_generator.cpp | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/buildcc/lib/target/test/target/test_generator.cpp b/buildcc/lib/target/test/target/test_generator.cpp index 27891d5b..9d8dc641 100644 --- a/buildcc/lib/target/test/target/test_generator.cpp +++ b/buildcc/lib/target/test/target/test_generator.cpp @@ -314,7 +314,27 @@ TEST(GeneratorTestGroup, Generator_FailedEnvTaskState) { generator.AddCommand("{compiler} -o {gen_build_dir}/dummy_main.exe " "{gen_root_dir}/dummy_main.c"); - // buildcc::m::CommandExpect_Execute(1, true); + generator.Build(); + buildcc::base::m::GeneratorRunner(generator); + + mock().checkExpectations(); + + buildcc::env::set_task_state(buildcc::env::TaskState::SUCCESS); +} + +TEST(GeneratorTestGroup, Generator_FailedGenerateConvert) { + constexpr const char *const NAME = "FailedGenerateConvert"; + buildcc::base::Generator generator(NAME, "", false); + + generator.AddDefaultArguments({ + {"compiler", "gcc"}, + }); + + generator.AddInput("{gen_root_dir}/this_file_does_not_exist.c"); + generator.AddOutput("{gen_build_dir}/dummy_main.exe"); + generator.AddCommand("{compiler} -o {gen_build_dir}/dummy_main.exe " + "{gen_root_dir}/dummy_main.c"); + generator.Build(); buildcc::base::m::GeneratorRunner(generator); From cb30ebf1d8e2485a865644b08187ba6fdb60d9e2 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 29 Nov 2021 00:52:26 -0800 Subject: [PATCH 22/28] Update test_generator.cpp --- .../lib/target/test/target/test_generator.cpp | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/buildcc/lib/target/test/target/test_generator.cpp b/buildcc/lib/target/test/target/test_generator.cpp index 9d8dc641..c2d5a709 100644 --- a/buildcc/lib/target/test/target/test_generator.cpp +++ b/buildcc/lib/target/test/target/test_generator.cpp @@ -343,6 +343,28 @@ TEST(GeneratorTestGroup, Generator_FailedGenerateConvert) { buildcc::env::set_task_state(buildcc::env::TaskState::SUCCESS); } +TEST(GeneratorTestGroup, Generator_FailedGenerateCommand) { + constexpr const char *const NAME = "FailedGenerateCommand"; + buildcc::base::Generator generator(NAME, "", false); + + generator.AddDefaultArguments({ + {"compiler", "gcc"}, + }); + + generator.AddInput("{gen_root_dir}/dummy_main.c"); + generator.AddOutput("{gen_build_dir}/dummy_main.exe"); + generator.AddCommand("{compiler} -o {gen_build_dir}/dummy_main.exe " + "{gen_root_dir}/dummy_main.c"); + + buildcc::m::CommandExpect_Execute(1, false); + generator.Build(); + buildcc::base::m::GeneratorRunner(generator); + + mock().checkExpectations(); + + buildcc::env::set_task_state(buildcc::env::TaskState::SUCCESS); +} + int main(int ac, char **av) { fs::remove_all(BUILD_DIR); buildcc::env::init(fs::current_path() / "data", BUILD_DIR); From 2faa7dc67b944a09ddeaa98b32e6c1e0216fb109 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 29 Nov 2021 01:19:32 -0800 Subject: [PATCH 23/28] Update generator.h --- buildcc/lib/target/include/target/generator.h | 1 + 1 file changed, 1 insertion(+) diff --git a/buildcc/lib/target/include/target/generator.h b/buildcc/lib/target/include/target/generator.h index 104a7704..3c4b8574 100644 --- a/buildcc/lib/target/include/target/generator.h +++ b/buildcc/lib/target/include/target/generator.h @@ -98,6 +98,7 @@ class Generator : public BuilderInterface { tf::Taskflow &GetTaskflow() { return tf_; } const std::string &GetName() { return name_; } + env::TaskState GetTaskState() { return task_state_; } const std::string & GetValueByIdentifier(const std::string &file_identifier) const; From ea72a8b18066057bbcf007eac6983f2d88cf12b3 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 29 Nov 2021 01:20:04 -0800 Subject: [PATCH 24/28] Update test_generator.cpp --- .../lib/target/test/target/test_generator.cpp | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/buildcc/lib/target/test/target/test_generator.cpp b/buildcc/lib/target/test/target/test_generator.cpp index c2d5a709..b2e64316 100644 --- a/buildcc/lib/target/test/target/test_generator.cpp +++ b/buildcc/lib/target/test/target/test_generator.cpp @@ -365,6 +365,33 @@ TEST(GeneratorTestGroup, Generator_FailedGenerateCommand) { buildcc::env::set_task_state(buildcc::env::TaskState::SUCCESS); } +TEST(GeneratorTestGroup, Generator_FailedStore) { + constexpr const char *const NAME = "FailedStore"; + const fs::path test_build_dir = buildcc::env::get_project_build_dir() / NAME; + + buildcc::base::Generator generator(NAME, "", false); + fs::remove_all(test_build_dir); + + generator.AddDefaultArguments({ + {"compiler", "gcc"}, + }); + + generator.AddInput("{gen_root_dir}/dummy_main.c"); + generator.AddOutput("{gen_build_dir}/dummy_main.exe"); + generator.AddCommand("{compiler} -o {gen_build_dir}/dummy_main.exe " + "{gen_root_dir}/dummy_main.c"); + + buildcc::m::CommandExpect_Execute(1, true); + generator.Build(); + buildcc::base::m::GeneratorRunner(generator); + + CHECK(generator.GetTaskState() == buildcc::env::TaskState::FAILURE); + + mock().checkExpectations(); + + buildcc::env::set_task_state(buildcc::env::TaskState::SUCCESS); +} + int main(int ac, char **av) { fs::remove_all(BUILD_DIR); buildcc::env::init(fs::current_path() / "data", BUILD_DIR); From 1bc53dd231b22126cec9608b714456cad3d3bc4a Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 29 Nov 2021 01:44:37 -0800 Subject: [PATCH 25/28] Update task.cpp --- buildcc/lib/target/src/generator/task.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/buildcc/lib/target/src/generator/task.cpp b/buildcc/lib/target/src/generator/task.cpp index 35c6e7ef..88697f6f 100644 --- a/buildcc/lib/target/src/generator/task.cpp +++ b/buildcc/lib/target/src/generator/task.cpp @@ -46,7 +46,7 @@ void Generator::GenerateTask() { try { Convert(); BuildGenerate(); - } catch (const std::exception &e) { + } catch (...) { task_state_ = env::TaskState::FAILURE; } @@ -54,7 +54,7 @@ void Generator::GenerateTask() { try { bool success = Command::Execute(command); env::assert_throw(success, fmt::format("{} failed", command)); - } catch (const std::exception &e) { + } catch (...) { task_state_ = env::TaskState::FAILURE; } }; @@ -103,7 +103,7 @@ void Generator::GenerateTask() { if (dirty_ && (task_state_ == env::TaskState::SUCCESS)) { try { env::assert_throw(Store(), fmt::format("Store failed for {}", name_)); - } catch (const std::exception &e) { + } catch (...) { task_state_ = env::TaskState::FAILURE; } } From 3656ebeb24f3a8f1f6915bebd7e01daf7d943bc3 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 29 Nov 2021 01:53:46 -0800 Subject: [PATCH 26/28] Update task.cpp --- buildcc/lib/target/src/generator/task.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/buildcc/lib/target/src/generator/task.cpp b/buildcc/lib/target/src/generator/task.cpp index 88697f6f..f39edab2 100644 --- a/buildcc/lib/target/src/generator/task.cpp +++ b/buildcc/lib/target/src/generator/task.cpp @@ -42,14 +42,17 @@ void Generator::GenerateTask() { }); start_task.name(kStartGeneratorTaskName); - tf::Task generate_task = tf_.emplace([&](tf::Subflow &subflow) { + tf::Task pregenerate_task = tf_.emplace([&]() { try { Convert(); BuildGenerate(); } catch (...) { task_state_ = env::TaskState::FAILURE; } + return static_cast(task_state_); + }); + tf::Task generate_task = tf_.emplace([&](tf::Subflow &subflow) { auto run_command = [this](const std::string &command) { try { bool success = Command::Execute(command); @@ -60,7 +63,7 @@ void Generator::GenerateTask() { }; tf::Task command_task; - if (dirty_ && (task_state_ == env::TaskState::SUCCESS)) { + if (dirty_) { if (parallel_) { command_task = subflow.for_each(current_commands_.cbegin(), current_commands_.cend(), run_command); @@ -100,11 +103,13 @@ void Generator::GenerateTask() { // NOTE, Only store if the above state is marked dirty_ AND task_state_ == // SUCCESS - if (dirty_ && (task_state_ == env::TaskState::SUCCESS)) { - try { - env::assert_throw(Store(), fmt::format("Store failed for {}", name_)); - } catch (...) { - task_state_ = env::TaskState::FAILURE; + if (task_state_ == env::TaskState::SUCCESS) { + if (dirty_) { + try { + env::assert_throw(Store(), fmt::format("Store failed for {}", name_)); + } catch (...) { + task_state_ = env::TaskState::FAILURE; + } } } @@ -116,7 +121,8 @@ void Generator::GenerateTask() { end_task.name(kEndGeneratorTaskName); // Dependencies - start_task.precede(generate_task, end_task); + start_task.precede(pregenerate_task, end_task); + pregenerate_task.precede(generate_task, end_task); generate_task.precede(end_task); } From ffa53b005f709168d64b7e0d5cf45f7f6b6117c3 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 29 Nov 2021 03:11:15 -0800 Subject: [PATCH 27/28] Update task.cpp --- buildcc/lib/target/include/target/generator.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/buildcc/lib/target/include/target/generator.h b/buildcc/lib/target/include/target/generator.h index 3c4b8574..fe41eabc 100644 --- a/buildcc/lib/target/include/target/generator.h +++ b/buildcc/lib/target/include/target/generator.h @@ -18,6 +18,7 @@ #define TARGET_GENERATOR_H_ #include +#include #include #include #include @@ -134,6 +135,7 @@ class Generator : public BuilderInterface { bool parallel_{false}; // Internal + std::mutex task_state_mutex_; env::TaskState task_state_{env::TaskState::SUCCESS}; Command command_; tf::Taskflow tf_; From 724b7515224e74d35b60057520db3a456da81897 Mon Sep 17 00:00:00 2001 From: Niket Naidu Date: Mon, 29 Nov 2021 03:11:21 -0800 Subject: [PATCH 28/28] Update task.cpp --- buildcc/lib/target/src/generator/task.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/buildcc/lib/target/src/generator/task.cpp b/buildcc/lib/target/src/generator/task.cpp index f39edab2..2b5bdb3b 100644 --- a/buildcc/lib/target/src/generator/task.cpp +++ b/buildcc/lib/target/src/generator/task.cpp @@ -20,6 +20,7 @@ namespace { constexpr const char *const kStartGeneratorTaskName = "Start Generator"; +constexpr const char *const kPreGenerateTaskName = "PreGenerate"; constexpr const char *const kEndGeneratorTaskName = "End Generator"; constexpr const char *const kCommandTaskName = "Command"; @@ -51,6 +52,7 @@ void Generator::GenerateTask() { } return static_cast(task_state_); }); + pregenerate_task.name(kPreGenerateTaskName); tf::Task generate_task = tf_.emplace([&](tf::Subflow &subflow) { auto run_command = [this](const std::string &command) { @@ -58,6 +60,7 @@ void Generator::GenerateTask() { bool success = Command::Execute(command); env::assert_throw(success, fmt::format("{} failed", command)); } catch (...) { + std::lock_guard guard(task_state_mutex_); task_state_ = env::TaskState::FAILURE; } }; @@ -68,7 +71,7 @@ void Generator::GenerateTask() { command_task = subflow.for_each(current_commands_.cbegin(), current_commands_.cend(), run_command); } else { - command_task = subflow.emplace([&]() { + command_task = subflow.emplace([&, run_command]() { for (const auto &command : current_commands_) { run_command(command); }