所有权指针明确

This commit is contained in:
2026-08-28 14:10:36 +08:00
parent e07d16ea74
commit 93d3f93774
38 changed files with 407 additions and 380 deletions
+18 -18
View File
@@ -1162,7 +1162,7 @@ void Plot::Private::render_frame(Plot_Render_Tick tick) {
void Plot::Private::publish_completed_frame(
not_null<Render_Frame*> completed) {
std::optional<not_null<Managed_Frame*>> managed;
Managed_Frame* managed{};
for (auto& slot : frame_slots) {
const auto frame = std::visit(
[](const auto& value) -> not_null<Render_Frame*> {
@@ -1175,7 +1175,7 @@ void Plot::Private::publish_completed_frame(
}
if (!managed)
throw std::logic_error("completed frame has no owning Plot policy slot");
if ((*managed)->state.load(std::memory_order_acquire) !=
if (managed->state.load(std::memory_order_acquire) !=
Frame_State::rendering)
throw std::logic_error("completed Plot frame is not rendering");
const auto frame = completed;
@@ -1188,7 +1188,7 @@ void Plot::Private::publish_completed_frame(
std::uint32_t width{};
std::uint32_t height{};
if (auto *frame_2d =
std::get_if<std::unique_ptr<Frame_2D>>(&(*managed)->frame)) {
std::get_if<std::unique_ptr<Frame_2D>>(&managed->frame)) {
pixel_layout = Plot_Pixel_Layout::bgra8;
const auto image = (*frame_2d)->image();
width = static_cast<std::uint32_t>(image.width);
@@ -1201,7 +1201,7 @@ void Plot::Private::publish_completed_frame(
height = static_cast<std::uint32_t>(output.height);
}
} else {
auto &frame_3d = std::get<std::unique_ptr<Frame_3D>>((*managed)->frame);
auto &frame_3d = std::get<std::unique_ptr<Frame_3D>>(managed->frame);
rendered_identity = frame_3d->rendered_identity();
const auto extent = frame_3d->extent();
width = extent.width;
@@ -1211,7 +1211,7 @@ void Plot::Private::publish_completed_frame(
}
auto pixels = std::make_shared<const Plot_Pixel_Frame>(Plot_Pixel_Frame{
std::move(pixel_storage), pixel_layout, (*managed)->presentation_time,
std::move(pixel_storage), pixel_layout, managed->presentation_time,
identity.sequence, identity.correlation_id, rendered_identity.sequence,
rendered_identity.correlation_id, width, height});
@@ -1225,14 +1225,14 @@ void Plot::Private::publish_completed_frame(
std::chrono::steady_clock::now() - publish_started)
.count())));
auto expected = Frame_State::rendering;
if (!(*managed)->state.compare_exchange_strong(
if (!managed->state.compare_exchange_strong(
expected, Frame_State::consuming, std::memory_order_acq_rel,
std::memory_order_acquire))
throw std::logic_error("Plot frame left rendering before pixel publish");
}
void Plot::Private::consume_completed_frame(not_null<Render_Frame*> frame) {
std::optional<not_null<Managed_Frame*>> managed;
Managed_Frame* managed{};
for (auto& slot : frame_slots) {
const auto address = std::visit(
[](const auto& value) -> not_null<Render_Frame*> {
@@ -1253,7 +1253,7 @@ void Plot::Private::consume_completed_frame(not_null<Render_Frame*> frame) {
* 释放 Plot 的 view/update 门,并立刻唤醒 busy 期间保留的 latest tick。
* 之后外接 DAG 仍在当前 Frame trace 内执行,但不会阻塞下一帧渲染。
*/
if (std::holds_alternative<std::unique_ptr<Frame_2D>>((*managed)->frame))
if (std::holds_alternative<std::unique_ptr<Frame_2D>>(managed->frame))
release_render_admission(lifetime);
if (post_publish_graph.empty()) return;
@@ -1336,7 +1336,7 @@ void Plot::Private::consume_retired_frames() {
}
void Plot::Private::retire_completed_frame(not_null<Render_Frame*> frame) {
std::optional<not_null<Managed_Frame*>> managed;
Managed_Frame* managed{};
for (auto& slot : frame_slots) {
const auto address = std::visit(
[](const auto& value) -> not_null<Render_Frame*> {
@@ -1352,15 +1352,15 @@ void Plot::Private::retire_completed_frame(not_null<Render_Frame*> frame) {
auto* head = retired_frames.load(std::memory_order_relaxed);
do {
(*managed)->retired_next.store(head, std::memory_order_relaxed);
managed->retired_next.store(head, std::memory_order_relaxed);
} while (!retired_frames.compare_exchange_weak(
head, managed->get(), std::memory_order_release,
head, managed, std::memory_order_release,
std::memory_order_relaxed));
arm_tick_consumer(lifetime);
}
void Plot::Private::finalize_retired_frame(not_null<Render_Frame*> frame) {
std::optional<not_null<Managed_Frame*>> managed;
Managed_Frame* managed{};
for (auto& slot : frame_slots) {
const auto address = std::visit(
[](const auto& value) -> not_null<Render_Frame*> {
@@ -1376,9 +1376,9 @@ void Plot::Private::finalize_retired_frame(not_null<Render_Frame*> frame) {
throw std::logic_error("retired frame has no owned Plot slot");
const auto completion_latency =
(*managed)->submitted_at.time_since_epoch().count() == 0
managed->submitted_at.time_since_epoch().count() == 0
? std::chrono::steady_clock::duration::zero()
: std::chrono::steady_clock::now() - (*managed)->submitted_at;
: std::chrono::steady_clock::now() - managed->submitted_at;
std::optional<Datoviz_Frame_Observation> datoviz_observation;
if (auto* frame_3d = dynamic_cast<Frame_3D*>(frame.get())) {
datoviz_observation = frame_3d->take_datoviz_observation();
@@ -1400,8 +1400,8 @@ void Plot::Private::finalize_retired_frame(not_null<Render_Frame*> frame) {
completed_frame_statistics.reset();
applied_statistics_generation = statistics_generation_value;
}
(*managed)->statistics = completed_frame_statistics.submit(*frame);
(*managed)->statistics_generation = statistics_generation_value;
managed->statistics = completed_frame_statistics.submit(*frame);
managed->statistics_generation = statistics_generation_value;
std::optional<Taskflow_Frame_Trace> captured_trace;
nlohmann::json captured_components;
@@ -1430,11 +1430,11 @@ void Plot::Private::finalize_retired_frame(not_null<Render_Frame*> frame) {
}
auto expected = Frame_State::consuming;
if (!(*managed)->state.compare_exchange_strong(
if (!managed->state.compare_exchange_strong(
expected, Frame_State::available, std::memory_order_acq_rel,
std::memory_order_acquire))
throw std::logic_error("retired Plot frame is not consuming");
latest_statistics_frame.store(managed->get(), std::memory_order_release);
latest_statistics_frame.store(managed, std::memory_order_release);
/* 物理槽是唯一背压原因;归还任意槽后只解除一次耗尽状态。 */
auto admission = Render_Admission_State::frame_slots_exhausted;