refactor: centralize runtime logic (v0.4)
Extract scheduler responsibilities into a dedicated Runtime component: - src/runtime.rs: New centralized control flow (669 lines) - src/scheduler.rs: Simplified to task queue & preemption management - tests/runtime.rs: Comprehensive runtime test suite - benches/multi_scheduler.rs: Multi-runtime scheduling benchmarks - Improves modularity and enables per-runtime configuration
This commit is contained in:
@@ -18,11 +18,11 @@ fn lock_free_mutex_succeeds() {
|
||||
run(move || {
|
||||
let m = Mutex::new(42u32);
|
||||
{
|
||||
let g = m.lock().unwrap();
|
||||
let g = m.lock_timeout(Duration::from_millis(500)).unwrap();
|
||||
c.store(*g, Ordering::SeqCst);
|
||||
}
|
||||
// After drop we can lock again.
|
||||
let g2 = m.lock().unwrap();
|
||||
let g2 = m.lock_timeout(Duration::from_millis(500)).unwrap();
|
||||
assert_eq!(*g2, 42);
|
||||
});
|
||||
assert_eq!(captured.load(Ordering::SeqCst), 42);
|
||||
@@ -53,10 +53,10 @@ fn guard_mutates_value_visible_through_next_lock() {
|
||||
run(move || {
|
||||
let m = Mutex::new(0u32);
|
||||
{
|
||||
let mut g = m.lock().unwrap();
|
||||
let mut g = m.lock_timeout(Duration::from_millis(500)).unwrap();
|
||||
*g = 7;
|
||||
}
|
||||
let g2 = m.lock().unwrap();
|
||||
let g2 = m.lock_timeout(Duration::from_millis(500)).unwrap();
|
||||
f.store(*g2, Ordering::SeqCst);
|
||||
});
|
||||
assert_eq!(final_value.load(Ordering::SeqCst), 7);
|
||||
@@ -80,19 +80,22 @@ fn contended_lock_parks_until_holder_releases() {
|
||||
let m_b = m.clone();
|
||||
|
||||
let a = spawn(move || {
|
||||
let g = m_a.lock().unwrap();
|
||||
let g = m_a.lock_timeout(Duration::from_millis(500)).unwrap();
|
||||
la.lock().unwrap().push("A_locked");
|
||||
// While holding, yield to let B run.
|
||||
// First yield: lets B run past its first yield_now.
|
||||
yield_now();
|
||||
// Second yield: lets B reach B_try and attempt lock() while we
|
||||
// still hold it, so B parks on the mutex.
|
||||
yield_now();
|
||||
la.lock().unwrap().push("A_dropping");
|
||||
drop(g);
|
||||
la.lock().unwrap().push("A_dropped");
|
||||
});
|
||||
let b = spawn(move || {
|
||||
// Wait a moment to make sure A locks first.
|
||||
// One yield: lets A run and acquire the lock first.
|
||||
yield_now();
|
||||
lb.lock().unwrap().push("B_try");
|
||||
let _g = m_b.lock().unwrap();
|
||||
let _g = m_b.lock_timeout(Duration::from_millis(500)).unwrap();
|
||||
lb.lock().unwrap().push("B_locked");
|
||||
});
|
||||
a.join().unwrap();
|
||||
@@ -127,7 +130,7 @@ fn lock_timeout_returns_err_when_holder_never_releases() {
|
||||
|
||||
let a = spawn(move || {
|
||||
// Hold the lock for 100ms, blocking B's attempt with a 20ms timeout.
|
||||
let _g = m_a.lock().unwrap();
|
||||
let _g = m_a.lock_timeout(Duration::from_millis(500)).unwrap();
|
||||
smarm::sleep(Duration::from_millis(100));
|
||||
// _g drops here.
|
||||
});
|
||||
@@ -175,7 +178,7 @@ fn waiters_are_granted_the_lock_in_fifo_order() {
|
||||
// releases. Each waiter records its arrival order on acquisition.
|
||||
let m_holder = m.clone();
|
||||
let holder = spawn(move || {
|
||||
let g = m_holder.lock().unwrap();
|
||||
let g = m_holder.lock_timeout(Duration::from_millis(500)).unwrap();
|
||||
// Let waiters pile up.
|
||||
for _ in 0..5 {
|
||||
yield_now();
|
||||
@@ -194,7 +197,7 @@ fn waiters_are_granted_the_lock_in_fifo_order() {
|
||||
for _ in 0..id {
|
||||
yield_now();
|
||||
}
|
||||
let _g = m_w.lock().unwrap();
|
||||
let _g = m_w.lock_timeout(Duration::from_millis(500)).unwrap();
|
||||
o.lock().unwrap().push(id);
|
||||
}));
|
||||
}
|
||||
@@ -224,7 +227,7 @@ fn grant_wins_when_holder_releases_before_timeout() {
|
||||
let m_b = m.clone();
|
||||
|
||||
let a = spawn(move || {
|
||||
let _g = m_a.lock().unwrap();
|
||||
let _g = m_a.lock_timeout(Duration::from_millis(500)).unwrap();
|
||||
// Hold for 10ms, well under B's 100ms timeout.
|
||||
smarm::sleep(Duration::from_millis(10));
|
||||
});
|
||||
@@ -257,7 +260,7 @@ fn next_waiter_gets_lock_after_holder_panics() {
|
||||
let m_b = m.clone();
|
||||
|
||||
let a = spawn(move || {
|
||||
let _g = m_a.lock().unwrap();
|
||||
let _g = m_a.lock_timeout(Duration::from_millis(500)).unwrap();
|
||||
yield_now();
|
||||
panic!("holder dies mid-critical-section");
|
||||
});
|
||||
@@ -295,7 +298,7 @@ fn many_actors_increment_shared_counter_via_mutex() {
|
||||
let m_i = m.clone();
|
||||
handles.push(spawn(move || {
|
||||
for _ in 0..PER_ACTOR {
|
||||
let mut g = m_i.lock().unwrap();
|
||||
let mut g = m_i.lock_timeout(Duration::from_millis(500)).unwrap();
|
||||
*g += 1;
|
||||
}
|
||||
}));
|
||||
@@ -303,7 +306,7 @@ fn many_actors_increment_shared_counter_via_mutex() {
|
||||
for h in handles {
|
||||
h.join().unwrap();
|
||||
}
|
||||
let g = m.lock().unwrap();
|
||||
let g = m.lock_timeout(Duration::from_millis(500)).unwrap();
|
||||
fv.store(*g, Ordering::SeqCst);
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user