3 #![allow(unused_assignments)]
4 #![allow(unused_variables)]
5 // ignore-emscripten no threads support
8 use std
::sync
::mpsc
::{channel, Sender}
;
10 #[derive(PartialEq, Debug)]
17 sender
: Sender
<Message
>
20 impl Drop
for SendOnDrop
{
22 self.sender
.send(Message
::Dropped
).unwrap();
27 SimpleVariant(Sender
<Message
>),
28 NestedVariant(Box
<usize>, SendOnDrop
, Sender
<Message
>),
29 FailingVariant { on_drop: SendOnDrop }
35 &mut Foo
::SimpleVariant(ref mut sender
) => {
36 sender
.send(Message
::DestructorRan
).unwrap();
38 &mut Foo
::NestedVariant(_
, _
, ref mut sender
) => {
39 sender
.send(Message
::DestructorRan
).unwrap();
41 &mut Foo
::FailingVariant { .. }
=> {
49 let (sender
, receiver
) = channel();
51 let v
= Foo
::SimpleVariant(sender
);
53 assert_eq
!(receiver
.recv().unwrap(), Message
::DestructorRan
);
54 assert_eq
!(receiver
.recv().ok(), None
);
56 let (sender
, receiver
) = channel();
58 let v
= Foo
::NestedVariant(Box
::new(42), SendOnDrop { sender: sender.clone() }
, sender
);
60 assert_eq
!(receiver
.recv().unwrap(), Message
::DestructorRan
);
61 assert_eq
!(receiver
.recv().unwrap(), Message
::Dropped
);
62 assert_eq
!(receiver
.recv().ok(), None
);
64 let (sender
, receiver
) = channel();
65 let t
= thread
::spawn(move|| {
66 let v
= Foo
::FailingVariant { on_drop: SendOnDrop { sender: sender }
};
68 assert_eq
!(receiver
.recv().unwrap(), Message
::Dropped
);
69 assert_eq
!(receiver
.recv().ok(), None
);
72 let (sender
, receiver
) = channel();
74 thread
::spawn(move|| {
75 let mut v
= Foo
::NestedVariant(Box
::new(42), SendOnDrop
{
76 sender
: sender
.clone()
78 v
= Foo
::NestedVariant(Box
::new(42),
79 SendOnDrop { sender: sender.clone() }
,
81 v
= Foo
::SimpleVariant(sender
.clone());
82 v
= Foo
::FailingVariant { on_drop: SendOnDrop { sender: sender }
};
85 assert_eq
!(receiver
.recv().unwrap(), Message
::DestructorRan
);
86 assert_eq
!(receiver
.recv().unwrap(), Message
::Dropped
);
87 assert_eq
!(receiver
.recv().unwrap(), Message
::DestructorRan
);
88 assert_eq
!(receiver
.recv().unwrap(), Message
::Dropped
);
89 assert_eq
!(receiver
.recv().unwrap(), Message
::DestructorRan
);
90 assert_eq
!(receiver
.recv().unwrap(), Message
::Dropped
);
91 assert_eq
!(receiver
.recv().ok(), None
);