修复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
+8 -25
View File
@@ -69,9 +69,8 @@ Visual_Family visual_family(std::string_view case_id) {
class Gallery_Scene3D final : public Gallery_Scene_Interface {
public:
Gallery_Scene3D(std::string case_id, Gallery_Frame_Mode mode,
bool automatic)
: case_id_(std::move(case_id)), mode_(mode), automatic_(automatic) {
Gallery_Scene3D(std::string case_id, Gallery_Frame_Mode mode)
: case_id_(std::move(case_id)), mode_(mode) {
rebuild();
}
@@ -86,12 +85,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;
}
@@ -109,11 +102,11 @@ public:
}
void dispatch(const Gallery_Input_Event&) override {}
Gallery_Render_Result render_latest_frame() override {
bool request_frame() override {
if (scene_->request_frame() != Frame_Request_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 {
@@ -152,14 +145,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;
@@ -167,7 +155,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;
@@ -203,12 +190,10 @@ private:
state.visual_family = visual_family(case_id_);
scene_ = Render_Scene_3D::Builder{state}.build(
visual_, make_strategy(mode_));
static_cast<void>(scene_->request_frame());
}
std::string case_id_;
Gallery_Frame_Mode mode_;
bool automatic_{};
Extent extent_{560, 320};
std::shared_ptr<Point_Visual> visual_;
std::unique_ptr<Render_Scene_3D> scene_;
@@ -218,9 +203,7 @@ private:
} // namespace
std::unique_ptr<Gallery_Scene_Interface> make_gallery_scene_3d(
std::uint64_t, std::string case_id, Gallery_Frame_Mode mode,
bool automatic_low_latency) {
return std::make_unique<Gallery_Scene3D>(
std::move(case_id), mode, automatic_low_latency);
std::uint64_t, std::string case_id, Gallery_Frame_Mode mode) {
return std::make_unique<Gallery_Scene3D>(std::move(case_id), mode);
}
} // namespace renderive::web