extern crate rustacuda;
use rustacuda::prelude::*;
use rustacuda::quick_init;
use std::sync::mpsc::sync_channel;
#[test]
fn test_stream_callbacks_execution_order() {
let _ctx = quick_init();
let stream = Stream::new(StreamFlags::NON_BLOCKING, None).unwrap();
let (order_sender, order_receiver) = sync_channel(0);
stream
.add_callback(Box::new(|_| {
order_sender.send(1).unwrap();
}))
.unwrap();
stream
.add_callback(Box::new(|_| {
order_sender.send(2).unwrap();
}))
.unwrap();
stream
.add_callback(Box::new(|_| {
order_sender.send(3).unwrap();
}))
.unwrap();
for expected in &[1, 2, 3] {
assert_eq!(*expected, order_receiver.recv().unwrap());
}
}
#[test]
fn test_stream_callbacks_environment_capture() {
let _ctx = quick_init();
let stream = Stream::new(StreamFlags::NON_BLOCKING, None).unwrap();
let (capture_sender, capture_receiver) = sync_channel(0);
let magic_numbers = (42, Box::new(1337));
stream
.add_callback(Box::new(|_| {
capture_sender.send(magic_numbers).unwrap();
}))
.unwrap();
let captured_magic_numbers = capture_receiver.recv().unwrap();
assert_eq!(42, captured_magic_numbers.0);
assert_eq!(1337, *captured_magic_numbers.1);
}
#[test]
fn test_stream_callbacks_status_propagation() {
let _ctx = quick_init();
let stream = Stream::new(StreamFlags::NON_BLOCKING, None).unwrap();
let (status_sender, status_receiver) = sync_channel(0);
stream
.add_callback(Box::new(|status| {
status_sender.send(status).unwrap();
}))
.unwrap();
assert_eq!(Ok(()), status_receiver.recv().unwrap())
}