Skip to content

Commit 5a9d4b0

Browse files
committed
Improved finalization of diagrams based on their futures status (#415)
1 parent 6dea41a commit 5a9d4b0

File tree

1 file changed

+88
-51
lines changed

1 file changed

+88
-51
lines changed

src/common/generators/generators.cc

Lines changed: 88 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,14 @@ void generate_diagrams_by_type(std::shared_ptr<config::diagram> diagram_config,
299299
}
300300
}
301301

302+
template <typename T> bool is_model_ready(T &futs)
303+
{
304+
using namespace std::chrono_literals;
305+
return std::all_of(futs.begin(), futs.end(), [](auto &fut) {
306+
return fut.valid() && fut.wait_for(5ms) == std::future_status::ready;
307+
});
308+
}
309+
302310
int generate_diagrams(const std::vector<std::string> &diagram_names,
303311
config::config &config, const common::compilation_database_ptr &db,
304312
const cli::runtime_config &runtime_config,
@@ -411,60 +419,89 @@ int generate_diagrams(const std::vector<std::string> &diagram_names,
411419

412420
LOG_INFO("Collecting diagram futures");
413421

414-
for (auto &[name, futs] : diagram_models) {
415-
try {
416-
if (std::holds_alternative<class_diagram_model_futures>(futs)) {
417-
auto combined_model = combine_partial_diagram_models<
418-
class_diagram::model::diagram>(
419-
std::get<class_diagram_model_futures>(futs));
420-
421-
generate_diagrams_by_type<config::class_diagram,
422-
class_diagram::model::diagram>(config.diagrams.at(name),
423-
*combined_model, name, runtime_config);
424-
}
425-
else if (std::holds_alternative<sequence_diagram_model_futures>(
426-
futs)) {
427-
auto combined_model = combine_partial_diagram_models<
428-
sequence_diagram::model::diagram>(
429-
std::get<sequence_diagram_model_futures>(futs));
430-
431-
generate_diagrams_by_type<config::sequence_diagram,
432-
sequence_diagram::model::diagram>(config.diagrams.at(name),
433-
*combined_model, name, runtime_config);
434-
}
435-
else if (std::holds_alternative<include_diagram_model_futures>(
436-
futs)) {
437-
auto combined_model = combine_partial_diagram_models<
438-
include_diagram::model::diagram>(
439-
std::get<include_diagram_model_futures>(futs));
440-
441-
generate_diagrams_by_type<config::include_diagram,
442-
include_diagram::model::diagram>(config.diagrams.at(name),
443-
*combined_model, name, runtime_config);
422+
size_t completed_diagrams{0};
423+
424+
while (completed_diagrams < diagram_models.size()) {
425+
for (auto &[name, futs_variant] : diagram_models) {
426+
try {
427+
if (std::holds_alternative<class_diagram_model_futures>(
428+
futs_variant)) {
429+
auto &futs =
430+
std::get<class_diagram_model_futures>(futs_variant);
431+
if (!is_model_ready(futs))
432+
continue;
433+
434+
auto combined_model = combine_partial_diagram_models<
435+
class_diagram::model::diagram>(futs);
436+
437+
generate_diagrams_by_type<config::class_diagram,
438+
class_diagram::model::diagram>(config.diagrams.at(name),
439+
*combined_model, name, runtime_config);
440+
}
441+
else if (std::holds_alternative<sequence_diagram_model_futures>(
442+
futs_variant)) {
443+
auto &futs =
444+
std::get<sequence_diagram_model_futures>(futs_variant);
445+
if (!is_model_ready(futs))
446+
continue;
447+
448+
auto combined_model = combine_partial_diagram_models<
449+
sequence_diagram::model::diagram>(futs);
450+
451+
generate_diagrams_by_type<config::sequence_diagram,
452+
sequence_diagram::model::diagram>(
453+
config.diagrams.at(name), *combined_model, name,
454+
runtime_config);
455+
}
456+
else if (std::holds_alternative<include_diagram_model_futures>(
457+
futs_variant)) {
458+
auto &futs =
459+
std::get<include_diagram_model_futures>(futs_variant);
460+
if (!is_model_ready(futs))
461+
continue;
462+
463+
auto combined_model = combine_partial_diagram_models<
464+
include_diagram::model::diagram>(futs);
465+
466+
generate_diagrams_by_type<config::include_diagram,
467+
include_diagram::model::diagram>(
468+
config.diagrams.at(name), *combined_model, name,
469+
runtime_config);
470+
}
471+
else if (std::holds_alternative<package_diagram_model_futures>(
472+
futs_variant)) {
473+
auto &futs =
474+
std::get<package_diagram_model_futures>(futs_variant);
475+
if (!is_model_ready(futs))
476+
continue;
477+
478+
auto combined_model = combine_partial_diagram_models<
479+
package_diagram::model::diagram>(futs);
480+
481+
generate_diagrams_by_type<config::package_diagram,
482+
package_diagram::model::diagram>(
483+
config.diagrams.at(name), *combined_model, name,
484+
runtime_config);
485+
}
486+
487+
if (indicator)
488+
indicator->complete(name);
489+
490+
completed_diagrams++;
444491
}
445-
else if (std::holds_alternative<package_diagram_model_futures>(
446-
futs)) {
447-
auto combined_model = combine_partial_diagram_models<
448-
package_diagram::model::diagram>(
449-
std::get<package_diagram_model_futures>(futs));
450-
451-
generate_diagrams_by_type<config::package_diagram,
452-
package_diagram::model::diagram>(config.diagrams.at(name),
453-
*combined_model, name, runtime_config);
492+
catch (clanguml::generators::clang_tool_exception &e) {
493+
if (indicator)
494+
indicator->fail(name);
495+
completed_diagrams++;
496+
throw std::move(e);
454497
}
498+
catch (std::exception &e) {
499+
if (indicator)
500+
indicator->fail(name);
501+
errors.emplace_back(std::current_exception());
455502

456-
if (indicator)
457-
indicator->complete(name);
458-
}
459-
catch (clanguml::generators::clang_tool_exception &e) {
460-
if (indicator)
461-
indicator->fail(name);
462-
throw std::move(e);
463-
}
464-
catch (std::exception &e) {
465-
if (indicator)
466-
indicator->fail(name);
467-
errors.emplace_back(std::current_exception());
503+
completed_diagrams++;
504+
}
468505
}
469506
}
470507

0 commit comments

Comments
 (0)