diff options
author | rabite <rabite@posteo.de> | 2019-03-10 00:52:24 +0100 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2019-03-10 00:52:24 +0100 |
commit | 7697811547b2d4c140e7c07ce112597085a04e65 (patch) | |
tree | 79e1ce2d794150ce6e110f9966ced1ef53051916 /src | |
parent | 9ef59ba0501f7d29edc42c6861ff259ab1914b37 (diff) |
read output of procs more efficiently
Diffstat (limited to 'src')
-rw-r--r-- | src/proclist.rs | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/src/proclist.rs b/src/proclist.rs index e2468db..5c04f5f 100644 --- a/src/proclist.rs +++ b/src/proclist.rs @@ -40,28 +40,29 @@ impl Process { let success = self.success.clone(); let sender = self.sender.clone(); - std::thread::spawn(move || { - let stdout = handle.lock().unwrap().stdout.take().unwrap(); + std::thread::spawn(move || -> HResult<()> { + let stdout = handle.lock()?.stdout.take()?; let mut stdout = BufReader::new(stdout); - loop { - let mut line = String::new(); - match stdout.read_line(&mut line) { - Ok(0) => break, - Ok(_) => { - output.lock().unwrap().push_str(&line); - sender.send(Events::WidgetReady).unwrap(); - } - Err(err) => { - let err: HResult<()> = Err(HError::from(err)); - err.log(); - break; - } + let mut processor = move || -> HResult<()> { + loop { + let buffer = stdout.fill_buf()?; + let len = buffer.len(); + let buffer = String::from_utf8_lossy(buffer); + + if len == 0 { return Ok(()) } + + output.lock()?.push_str(&buffer); + sender.send(Events::WidgetReady)?; + + stdout.consume(len); } + }; + processor().log(); + if let Ok(proc_status) = handle.lock()?.wait() { + *success.lock()? = Some(proc_status.success()); + *status.lock()? = proc_status.code(); } - if let Ok(proc_status) = handle.lock().unwrap().wait() { - *success.lock().unwrap() = Some(proc_status.success()); - *status.lock().unwrap() = proc_status.code(); - } + Ok(()) }); Ok(()) |