File: cycle_panic.rs

package info (click to toggle)
rust-salsa 0.23.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,424 kB
  • sloc: sh: 12; makefile: 2; javascript: 1
file content (43 lines) | stat: -rw-r--r-- 1,088 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Shuttle doesn't like panics inside of its runtime.
#![cfg(not(feature = "shuttle"))]

//! Test for panic in cycle recovery function, in cross-thread cycle.
use crate::setup::{Knobs, KnobsDatabase};

#[salsa::tracked(cycle_fn=cycle_fn, cycle_initial=initial)]
fn query_a(db: &dyn KnobsDatabase) -> u32 {
    db.signal(1);
    db.wait_for(2);
    query_b(db)
}

#[salsa::tracked(cycle_fn=cycle_fn, cycle_initial=initial)]
fn query_b(db: &dyn KnobsDatabase) -> u32 {
    db.wait_for(1);
    db.signal(2);
    query_a(db) + 1
}

fn cycle_fn(_db: &dyn KnobsDatabase, _value: &u32, _count: u32) -> salsa::CycleRecoveryAction<u32> {
    panic!("cancel!")
}

fn initial(_db: &dyn KnobsDatabase) -> u32 {
    0
}

#[test]
fn execute() {
    let db = Knobs::default();

    let db_t1 = db.clone();
    let t1 = std::thread::spawn(move || query_a(&db_t1));

    let db_t2 = db.clone();
    let t2 = std::thread::spawn(move || query_b(&db_t2));

    // The main thing here is that we don't deadlock.
    let (r1, r2) = (t1.join(), t2.join());
    assert!(r1.is_err());
    assert!(r2.is_err());
}