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
@@ -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);new file mode 100644@@ -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);+}