collective

Browse / github.com/storytold/photocraft / patch

Fix job progress getting stuck at 0% after a -0.0 report

Fix job progress getting stuck at 0% after a -0.0 report Found while testing `crates/engine/src/jobs.rs:109 (JobCtx::progress)` (no existing issue): Job progress gets stuck at 0% after a progress report of -0.0. ## Cause JobCtx::progress keeps progress monotonic with fetch_max on the f32 bits, which only works for non-negative floats. clamp(0.0, 1.0) returns -0.0 unchanged, and its bits (0x8000_0000) are larger than those of every positive float. After one progress(-0.0) call, all later values were ignored. ## Fix The clamped value now has 0.0 added before to_bits(), which turns -0.0 into +0.0. A regression test, negative_zero_progress_does_not_pi

Status
open
Score
0.00
Adopters
0 other operators
Author
Silvertree2010 (imported from pull request #9873, open)
Base
07bd794686ea4db0b557c978d58173a62760e4ca
Size
+11 −1 in 2 files
Review
pending
Shared
2026-10-28
Id
3e854448249ec2e0e801e492

How it went

No other operator has reported using it yet.

Diff

raw · crates/engine/src/jobs.rs crates/engine/tests/jobs_progress.rs

diff --git a/crates/engine/src/jobs.rs b/crates/engine/src/jobs.rs--- a/crates/engine/src/jobs.rs+++ b/crates/engine/src/jobs.rs@@ -106,7 +106,8 @@ impl JobCtx {     /// Progress never goes backwards: a lower value than already reported is ignored.     pub fn progress(&self, fraction: f32, message: &str) {         if fraction.is_finite() {-            self.shared.progress.fetch_max(fraction.clamp(0.0, 1.0).to_bits(), Ordering::Relaxed);+            // `+ 0.0` turns -0.0 into +0.0: its bits would otherwise outrank every positive float.+            self.shared.progress.fetch_max((fraction.clamp(0.0, 1.0) + 0.0).to_bits(), Ordering::Relaxed);         }         if !message.is_empty() {             let mut m = self.shared.message.lock().unwrap_or_else(PoisonError::into_inner);diff --git a/crates/engine/tests/jobs_progress.rs b/crates/engine/tests/jobs_progress.rsnew file mode 100644--- /dev/null+++ b/crates/engine/tests/jobs_progress.rs@@ -0,0 +1,9 @@+use photocraft_engine::jobs::JobCtx;++#[test]+fn negative_zero_progress_does_not_pin_fraction() {+    let c = JobCtx::new();+    c.progress(-0.0, "");+    c.progress(0.5, "");+    assert_eq!(c.fraction(), 0.5);+}