76 lines
2.0 KiB
Rust
76 lines
2.0 KiB
Rust
#![cfg(feature = "invocation")]
|
|
|
|
use std::{
|
|
sync::{Arc, Barrier},
|
|
thread::spawn,
|
|
};
|
|
|
|
use jni::{sys::jint, Executor};
|
|
|
|
mod util;
|
|
use util::{jvm, AtomicIntegerProxy};
|
|
|
|
#[test]
|
|
fn single_thread() {
|
|
let executor = Executor::new(jvm().clone());
|
|
test_single_thread(executor);
|
|
}
|
|
|
|
#[test]
|
|
fn serialized_threads() {
|
|
let executor = Executor::new(jvm().clone());
|
|
test_serialized_threads(executor);
|
|
}
|
|
|
|
#[test]
|
|
fn concurrent_threads() {
|
|
let executor = Executor::new(jvm().clone());
|
|
const THREAD_NUM: usize = 8;
|
|
test_concurrent_threads(executor, THREAD_NUM)
|
|
}
|
|
|
|
fn test_single_thread(executor: Executor) {
|
|
let mut atomic = AtomicIntegerProxy::new(executor, 0).unwrap();
|
|
assert_eq!(0, atomic.get().unwrap());
|
|
assert_eq!(1, atomic.increment_and_get().unwrap());
|
|
assert_eq!(3, atomic.add_and_get(2).unwrap());
|
|
assert_eq!(3, atomic.get().unwrap());
|
|
}
|
|
|
|
fn test_serialized_threads(executor: Executor) {
|
|
let mut atomic = AtomicIntegerProxy::new(executor, 0).unwrap();
|
|
assert_eq!(0, atomic.get().unwrap());
|
|
let jh = spawn(move || {
|
|
assert_eq!(1, atomic.increment_and_get().unwrap());
|
|
assert_eq!(3, atomic.add_and_get(2).unwrap());
|
|
atomic
|
|
});
|
|
let mut atomic = jh.join().unwrap();
|
|
assert_eq!(3, atomic.get().unwrap());
|
|
}
|
|
|
|
fn test_concurrent_threads(executor: Executor, thread_num: usize) {
|
|
const ITERS_PER_THREAD: usize = 10_000;
|
|
|
|
let mut atomic = AtomicIntegerProxy::new(executor, 0).unwrap();
|
|
let barrier = Arc::new(Barrier::new(thread_num));
|
|
let mut threads = Vec::new();
|
|
|
|
for _ in 0..thread_num {
|
|
let barrier = Arc::clone(&barrier);
|
|
let mut atomic = atomic.clone();
|
|
let jh = spawn(move || {
|
|
barrier.wait();
|
|
for _ in 0..ITERS_PER_THREAD {
|
|
atomic.increment_and_get().unwrap();
|
|
}
|
|
});
|
|
threads.push(jh);
|
|
}
|
|
for jh in threads {
|
|
jh.join().unwrap();
|
|
}
|
|
let expected = (ITERS_PER_THREAD * thread_num) as jint;
|
|
assert_eq!(expected, atomic.get().unwrap());
|
|
}
|