Advertisement
Guest User

Untitled

a guest
May 25th, 2015
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.96 KB | None | 0 0
  1. #![feature(scoped)]
  2. use std::thread;
  3. use std::sync::mpsc::{channel, Sender, Receiver};
  4.  
  5. fn main() {
  6. let (tx1, rx1) = channel();
  7. let (tx2, rx2) = channel();
  8. let _b1 = Bomb1(tx1, rx2);
  9. let b = Box::new(4);
  10. foo(tx2, rx1, &b);
  11. }
  12.  
  13. fn foo(done: Sender<()>, start: Receiver<()>, val: &i32) {
  14. enum Item<'a> {
  15. Thread(thread::JoinGuard<'a, ()>),
  16. Bomb(Bomb2),
  17. }
  18.  
  19. let mut v = Vec::new();
  20. v.push(Item::Bomb(Bomb2));
  21. v.push(Item::Thread(thread::scoped(move || {
  22. drop(start.recv());
  23. println!("value at {:p} = {}", val, val);
  24. drop(done.send(()));
  25. })));
  26. }
  27.  
  28. struct Bomb1(Sender<()>, Receiver<()>);
  29. impl Drop for Bomb1 {
  30. fn drop(&mut self) {
  31. println!("letting the child go");
  32. drop(self.0.send(()));
  33. drop(self.1.recv());
  34. println!("returning from main thread");
  35. }
  36. }
  37.  
  38. struct Bomb2;
  39. impl Drop for Bomb2 {
  40. fn drop(&mut self) {
  41. panic!("panicking on main thread");
  42. }
  43. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement