diff --git a/fuzzers/FRET/src/systemstate/observers.rs b/fuzzers/FRET/src/systemstate/observers.rs index 4c30b6bcc9..bee3bfbab9 100644 --- a/fuzzers/FRET/src/systemstate/observers.rs +++ b/fuzzers/FRET/src/systemstate/observers.rs @@ -398,14 +398,17 @@ fn get_release_response_pairs(rel: &Vec<(u64, String)>, resp: &Vec<(u64, String) if ready.contains_key(&next_resp.1) { if ready[&next_resp.1] >= next_resp.0 { if let Some(lr) = last_response.get(&next_resp.1) { - maybe_error = true; - // eprintln!("Task {} response at {:.1}ms before next release at {:.1}ms. Fallback to last response at {:.1}ms.", next_resp.1, crate::time::clock::tick_to_time(next_resp.0).as_micros() as f32/1000.0, crate::time::clock::tick_to_time(ready[&next_resp.1]).as_micros() as f32/1000.0, crate::time::clock::tick_to_time(*lr).as_micros() as f32/1000.0); + if u128::abs_diff(crate::time::clock::tick_to_time(next_resp.0).as_micros(), crate::time::clock::tick_to_time(*lr).as_micros()) > 500 { // tolerate pending notifications for 500us + maybe_error = true; + // eprintln!("Task {} response at {:.1}ms before next release at {:.1}ms. Fallback to last response at {:.1}ms.", next_resp.1, crate::time::clock::tick_to_time(next_resp.0).as_micros() as f32/1000.0, crate::time::clock::tick_to_time(ready[&next_resp.1]).as_micros() as f32/1000.0, crate::time::clock::tick_to_time(*lr).as_micros() as f32/1000.0); + } // Sometimes a task is released immediately after a response. This might not be detected. // Assume that the release occured with the last response ret.push((*lr, next_resp.0, next_resp.1.clone())); last_response.insert(&next_resp.1, next_resp.0); } else { - // eprintln!("Task {} released after response", next_resp.1); + maybe_error = true; + // eprintln!("Task {} released after response", next_resp.1); } } else { // assert!(peek_resp.0 >= ready[&peek_resp.1]); @@ -414,15 +417,18 @@ fn get_release_response_pairs(rel: &Vec<(u64, String)>, resp: &Vec<(u64, String) ready.remove(&next_resp.1); } } else { - maybe_error = true; if let Some(lr) = last_response.get(&next_resp.1) { - // eprintln!("Task {} response at {:.1}ms not found in ready list. Fallback to last release at {:.1}ms.", next_resp.1, crate::time::clock::tick_to_time(next_resp.0).as_micros() as f32/1000.0, crate::time::clock::tick_to_time(*lr).as_micros() as f32/1000.0); - // Sometimes a task is released immediately after a response. This might not be detected. + if u128::abs_diff(crate::time::clock::tick_to_time(next_resp.0).as_micros(), crate::time::clock::tick_to_time(*lr).as_micros()) > 500 { // tolerate pending notifications for 500us + maybe_error = true; + // eprintln!("Task {} response at {:.1}ms not found in ready list. Fallback to last response at {:.1}ms.", next_resp.1, crate::time::clock::tick_to_time(next_resp.0).as_micros() as f32/1000.0, crate::time::clock::tick_to_time(*lr).as_micros() as f32/1000.0); + } + // Sometimes a task is released immediately after a response (e.g. pending notification). This might not be detected. // Assume that the release occured with the last response ret.push((*lr, next_resp.0, next_resp.1.clone())); last_response.insert(&next_resp.1, next_resp.0); } else { - eprintln!("Task {} response at {:.1}ms not found in ready list", next_resp.1, crate::time::clock::tick_to_time(next_resp.0).as_micros() as f32/1000.0); + maybe_error = true; + // eprintln!("Task {} response at {:.1}ms not found in ready list", next_resp.1, crate::time::clock::tick_to_time(next_resp.0).as_micros() as f32/1000.0); } } } else {