@@ -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+
302310int 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