Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.27 KB | None | 0 0
  1. use mio::{Poll, Token, Ready, PollOpt, Events, Evented};
  2. use std::process::{Command, Stdio};
  3. use mio_child_process::{CommandAsync, Process};
  4. use std::sync::mpsc::TryRecvError;
  5. use std::collections::HashMap;
  6. use mio_extras::channel::{sync_channel, SyncSender};
  7. use std::io::{BufRead, stdin};
  8.  
  9. fn read_commands<R: BufRead>(reader: R, output: SyncSender<String>) {
  10. for line in reader.lines() {
  11. output.send(line.unwrap()).unwrap();
  12. }
  13. }
  14.  
  15. struct ProcessPoll {
  16. poll: Poll,
  17. processes: HashMap<Token, Process>,
  18. commands_finished: bool,
  19. next_command_id: usize,
  20. }
  21.  
  22. fn main() {
  23. let (command_sender, command_receiver) = sync_channel(32);
  24. let reader = std::thread::spawn(|| {
  25. read_commands(stdin().lock(), command_sender)
  26. });
  27.  
  28. let mut process_poll = ProcessPoll {
  29. poll: Poll::new().expect("Could not spawn poll"),
  30. processes: HashMap::new(),
  31. commands_finished: false,
  32. next_command_id: 1,
  33. };
  34.  
  35. let reader_token = Token(0);
  36. command_receiver
  37. .register(&process_poll.poll, reader_token, Ready::all(), PollOpt::edge())
  38. .expect("Could no register");
  39.  
  40. let mut events = Events::with_capacity(32);
  41.  
  42. while !process_poll.commands_finished || !process_poll.processes.is_empty() {
  43. process_poll.poll.poll(&mut events, None).expect("Could not poll");
  44. for event in &events {
  45. if event.token() == reader_token {
  46. loop {
  47. let command_line = match command_receiver.try_recv() {
  48. Ok(r) => r,
  49. Err(TryRecvError::Empty) => break,
  50. Err(TryRecvError::Disconnected) => {
  51. process_poll.commands_finished = true;
  52. break;
  53. },
  54. };
  55.  
  56. let process = Command::new("cmd")
  57. .arg("/C")
  58. .arg(command_line)
  59. .stdout(Stdio::piped())
  60. .stderr(Stdio::piped())
  61. .spawn_async()
  62. .expect("cmd doesn't exist!");
  63.  
  64. let token = Token(process_poll.next_command_id);
  65. process_poll.next_command_id += 1;
  66.  
  67. process
  68. .register(&process_poll.poll, token, Ready::all(), PollOpt::edge())
  69. .expect("Could not register");
  70.  
  71. println!("Process {}: Started on PID {}", token.0, process.id());
  72.  
  73. process_poll.processes.insert(token, process);
  74. }
  75. } else {
  76. loop {
  77. let process = process_poll.processes.get_mut(&event.token()).unwrap();
  78. let process_event = match process.try_recv() {
  79. Ok(r) => r,
  80. Err(TryRecvError::Empty) => break,
  81. Err(TryRecvError::Disconnected) => {
  82. process_poll.processes.remove(&event.token()).unwrap();
  83. break;
  84. },
  85. };
  86.  
  87. println!("Process {}: {:?}", event.token().0, process_event);
  88. }
  89. }
  90. }
  91. }
  92.  
  93. reader.join().expect("Reader thread panicked!");
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement