diff --git a/builder.cpp b/builder.cpp index f4ba922..69514aa 100644 --- a/builder.cpp +++ b/builder.cpp @@ -14,6 +14,7 @@ #include #include #include +#include using std::string; using namespace fmt; @@ -32,13 +33,15 @@ Builder::Builder(GUI &g, GameEngine &engine) config["build_cmd"].template get_to(build_cmd); } -FILE *start_command(string &build_cmd) { +FILE *Builder::start_command(string &build_cmd) { + std::lock_guard lock(fsm_mutex); FILE *build_out = popen(build_cmd.c_str(), "r"); dbc::check(build_out != nullptr, "Failed to run command."); return build_out; } -string read_line(FILE *build_out, bool &done_out) { +string Builder::read_line(FILE *build_out, bool &done_out) { + std::lock_guard lock(fsm_mutex); char buffer[BUF_MAX]; char *res = fgets(buffer, BUF_MAX, build_out); done_out = res == nullptr; diff --git a/builder.hpp b/builder.hpp index 7b3ae5c..c8341b3 100644 --- a/builder.hpp +++ b/builder.hpp @@ -42,6 +42,7 @@ class Builder : DeadSimpleFSM { string line = ""; std::future build_fut; std::future read_fut; + std::mutex fsm_mutex; git_repository* repo = nullptr; public: @@ -49,6 +50,8 @@ class Builder : DeadSimpleFSM { Builder(GUI &g, GameEngine &engine); MatchResult parse_line(const string &line); + string read_line(FILE *build_out, bool &done_out); + FILE *start_command(string &build_cmd); void event(BuildEvent ev) override { try { diff --git a/game_engine.cpp b/game_engine.cpp index 3614526..460b2a5 100644 --- a/game_engine.cpp +++ b/game_engine.cpp @@ -64,7 +64,7 @@ void GameEngine::idle(GameEvent ev) { void GameEngine::in_round(GameEvent ev, string &hit_type) { switch(ev) { case GameEvent::HIT: - hit(hit_type); // FIXME: bring back error type + hit(hit_type); if(is_dead()) { state(GameState::DEAD); } else {