Skip to content

Commit 5d4e953

Browse files
committed
Add regression test for deadlocking rayon
1 parent 73b4fe5 commit 5d4e953

File tree

3 files changed

+30
-3
lines changed

3 files changed

+30
-3
lines changed

Cargo.toml

+4
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ harness = false
2727
name = "large_image"
2828
harness = false
2929

30+
[[test]]
31+
name = "rayon"
32+
required-features = ["rayon"]
33+
3034
[features]
3135
default = ["rayon"]
3236
platform_independent = []

src/worker/multithreaded.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ use super::immediate::ImmediateWorker;
1212

1313
pub fn with_multithreading<T>(f: impl FnOnce(&mut dyn Worker) -> T) -> T {
1414
#[cfg(not(feature = "rayon"))]
15-
let mut worker = StdThreadWorker(MpscWorker::default());
15+
return self::enter_threads(f);
1616

1717
#[cfg(feature = "rayon")]
18-
jpeg_rayon::enter(|mut worker| {
18+
return jpeg_rayon::enter(|mut worker| {
1919
f(&mut worker)
20-
})
20+
});
2121
}
2222

2323
enum WorkerMsg {
@@ -128,6 +128,13 @@ fn collect_worker_thread(rx: Receiver<Vec<u8>>) -> Vec<u8> {
128128
rx.recv().expect("jpeg-decoder worker thread error")
129129
}
130130

131+
#[allow(dead_code)]
132+
fn enter_threads<T>(f: impl FnOnce(&mut dyn Worker) -> T) -> T {
133+
let mut worker = StdThreadWorker(MpscWorker::default());
134+
f(&mut worker)
135+
}
136+
137+
131138
#[cfg(feature = "rayon")]
132139
mod jpeg_rayon {
133140
use crate::error::Result;

tests/rayon.rs

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
use std::{fs::File, path::Path};
2+
use jpeg_decoder::Decoder;
3+
4+
#[test]
5+
fn decoding_in_limited_threadpool_does_not_deadlock() {
6+
let path = Path::new("tests").join("reftest").join("images").join("mozilla").join("jpg-progressive.jpg");
7+
8+
let pool = rayon::ThreadPoolBuilder::new()
9+
.num_threads(1)
10+
.build()
11+
.unwrap();
12+
pool.install(|| {
13+
let mut decoder = Decoder::new(File::open(&path).unwrap());
14+
let _ = decoder.decode().unwrap();
15+
});
16+
}

0 commit comments

Comments
 (0)