修复webserver死锁

This commit is contained in:
2026-08-17 20:38:43 +08:00
parent 47cf1af7a5
commit 03433a412a
16 changed files with 160 additions and 349 deletions
+10 -34
View File
@@ -70,9 +70,8 @@ Time_Of_Day current_time_of_day() {
class Gallery_Scene2D final : public Gallery_Scene_Interface {
public:
Gallery_Scene2D(std::string case_id, Gallery_Frame_Mode mode,
bool automatic)
: case_id_(std::move(case_id)), mode_(mode), automatic_(automatic) {
Gallery_Scene2D(std::string case_id, Gallery_Frame_Mode mode)
: case_id_(std::move(case_id)), mode_(mode) {
rebuild();
}
@@ -93,14 +92,6 @@ public:
Gallery_Frame_Mode frame_mode() const noexcept override { return mode_; }
void reset_monitoring() override { render_count_ = 0; }
bool can_render_automatically() const noexcept override {
return automatic_ && mode_ == Gallery_Frame_Mode::Low_Latency;
}
std::uint64_t kernel_refresh_interval_ns() const override {
return scene_->observer().next_refresh_interval_ns;
}
void set_client_metrics(Gallery_Client_Performance metrics) noexcept override {
client_ = metrics;
}
@@ -129,18 +120,15 @@ public:
}, event);
}
Gallery_Render_Result render_latest_frame() override {
bool request_frame() override {
update_samples();
const auto result = scene_->render_frame(true);
if (!result) return Gallery_Render_Result::backend_failure;
if (*result == Plot_Render_Status::view_inactive)
return Gallery_Render_Result::inactive;
if (*result != Plot_Render_Status::rendered)
return Gallery_Render_Result::frame_unavailable;
if (!result || *result != Plot_Render_Status::rendered)
return false;
if (scene_->wait_for_render() != Scene_Render_Result::none)
return Gallery_Render_Result::backend_failure;
return false;
++render_count_;
return Gallery_Render_Result::none;
return true;
}
std::optional<std::string> encode_latest_pixels() override {
@@ -178,14 +166,9 @@ public:
mode_ = next;
return "frame strategy replaced";
}
if (request.id == "mode_cycle" || request.id == "mode_render") {
static_cast<void>(render_latest_frame());
return "frame rendered";
}
if (request.id == "capture_next_frame") {
const auto capture = scene_->capture_next_frame();
if (capture) static_cast<void>(render_latest_frame());
return capture ? "frame captured" : "capture request rejected";
return capture ? "capture request accepted" : "capture request rejected";
}
if (request.id == "capture_frames") {
std::size_t count = 20;
@@ -193,7 +176,6 @@ public:
count = static_cast<std::size_t>(std::clamp(
std::get<double>(*request.argument), 1.0, 1000.0));
const auto capture = scene_->capture_frames(count);
if (capture) static_cast<void>(render_latest_frame());
return capture ? "frame capture started" : "capture request rejected";
}
recognized = false;
@@ -379,9 +361,6 @@ private:
}
scene_->activate_view();
update_samples();
static_cast<void>(scene_->render_frame(true));
static_cast<void>(scene_->wait_for_render());
}
void update_samples() {
@@ -437,7 +416,6 @@ private:
std::string case_id_;
Gallery_Frame_Mode mode_;
bool automatic_{};
Size viewport_{560, 320};
std::unique_ptr<Render_Scene_2D> scene_;
renderive_Owner<Frequency_Axis> frequency_axis_;
@@ -458,9 +436,7 @@ private:
} // namespace
std::unique_ptr<Gallery_Scene_Interface> make_gallery_scene_2d(
std::uint64_t, std::string case_id, Gallery_Frame_Mode mode,
bool automatic_low_latency) {
return std::make_unique<Gallery_Scene2D>(
std::move(case_id), mode, automatic_low_latency);
std::uint64_t, std::string case_id, Gallery_Frame_Mode mode) {
return std::make_unique<Gallery_Scene2D>(std::move(case_id), mode);
}
} // namespace renderive::web
+1 -1
View File
@@ -4,5 +4,5 @@
#include <memory>
#include <string>
namespace renderive::web {
[[nodiscard]] std::unique_ptr<Gallery_Scene_Interface> make_gallery_scene_2d(std::uint64_t session_id, std::string case_id, Gallery_Frame_Mode mode, bool automatic_low_latency);
[[nodiscard]] std::unique_ptr<Gallery_Scene_Interface> make_gallery_scene_2d(std::uint64_t session_id, std::string case_id, Gallery_Frame_Mode mode);
}