3 #![allow(unused_assignments)]
4 #![allow(unused_variables)]
5 // ignore-emscripten no threads support
9 use std::sync::mpsc::{channel, Sender};
11 #[derive(PartialEq, Debug)]
18 sender: Sender<Message>
21 impl Drop for SendOnDrop {
23 self.sender.send(Message::Dropped).unwrap();
28 SimpleVariant(Sender<Message>),
29 NestedVariant(Box<usize>, SendOnDrop, Sender<Message>),
30 FailingVariant { on_drop: SendOnDrop }
36 &mut Foo::SimpleVariant(ref mut sender) => {
37 sender.send(Message::DestructorRan).unwrap();
39 &mut Foo::NestedVariant(_, _, ref mut sender) => {
40 sender.send(Message::DestructorRan).unwrap();
42 &mut Foo::FailingVariant { .. } => {
50 let (sender, receiver) = channel();
52 let v = Foo::SimpleVariant(sender);
54 assert_eq!(receiver.recv().unwrap(), Message::DestructorRan);
55 assert_eq!(receiver.recv().ok(), None);
57 let (sender, receiver) = channel();
59 let v = Foo::NestedVariant(Box::new(42), SendOnDrop { sender: sender.clone() }, sender);
61 assert_eq!(receiver.recv().unwrap(), Message::DestructorRan);
62 assert_eq!(receiver.recv().unwrap(), Message::Dropped);
63 assert_eq!(receiver.recv().ok(), None);
65 let (sender, receiver) = channel();
66 let t = thread::spawn(move|| {
67 let v = Foo::FailingVariant { on_drop: SendOnDrop { sender: sender } };
69 assert_eq!(receiver.recv().unwrap(), Message::Dropped);
70 assert_eq!(receiver.recv().ok(), None);
73 let (sender, receiver) = channel();
75 thread::spawn(move|| {
76 let mut v = Foo::NestedVariant(Box::new(42), SendOnDrop {
77 sender: sender.clone()
79 v = Foo::NestedVariant(Box::new(42),
80 SendOnDrop { sender: sender.clone() },
82 v = Foo::SimpleVariant(sender.clone());
83 v = Foo::FailingVariant { on_drop: SendOnDrop { sender: sender } };
86 assert_eq!(receiver.recv().unwrap(), Message::DestructorRan);
87 assert_eq!(receiver.recv().unwrap(), Message::Dropped);
88 assert_eq!(receiver.recv().unwrap(), Message::DestructorRan);
89 assert_eq!(receiver.recv().unwrap(), Message::Dropped);
90 assert_eq!(receiver.recv().unwrap(), Message::DestructorRan);
91 assert_eq!(receiver.recv().unwrap(), Message::Dropped);
92 assert_eq!(receiver.recv().ok(), None);