summaryrefslogtreecommitdiff
path: root/src/shell_manager.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-12-03 13:56:02 +0000
committerMaxime Coste <frrrwww@gmail.com>2014-12-03 13:56:02 +0000
commit0517a19e6d6911d8d516a7a554aad829bf78a431 (patch)
tree482923d4fd88895598bd7c1b1dab7960f33489f4 /src/shell_manager.cc
parentdef4221ac7d1850f1024217a098da8e1c368fdfd (diff)
Use a select based event handling and fix deadlock
Diffstat (limited to 'src/shell_manager.cc')
-rw-r--r--src/shell_manager.cc21
1 files changed, 7 insertions, 14 deletions
diff --git a/src/shell_manager.cc b/src/shell_manager.cc
index 0391dc4f..f037371c 100644
--- a/src/shell_manager.cc
+++ b/src/shell_manager.cc
@@ -66,27 +66,20 @@ String ShellManager::pipe(StringView input,
String error;
{
- auto pipe_reader = [](String& output, bool& closed) {
- return [&output, &closed](FDWatcher& watcher, EventMode) {
- if (closed)
- return;
- const int fd = watcher.fd();
+ auto pipe_reader = [](String& output) {
+ return [&output](FDWatcher& watcher, EventMode) {
char buffer[1024];
- size_t size = read(fd, buffer, 1024);
+ size_t size = read(watcher.fd(), buffer, 1024);
if (size <= 0)
- {
- close(fd);
- closed = true;
- }
+ watcher.close_fd();
output += String(buffer, buffer+size);
};
};
- bool stdout_closed = false, stderr_closed = false;
- FDWatcher stdout_watcher{read_pipe[0], pipe_reader(output, stdout_closed)};
- FDWatcher stderr_watcher{error_pipe[0], pipe_reader(error, stderr_closed)};
+ FDWatcher stdout_watcher{read_pipe[0], pipe_reader(output)};
+ FDWatcher stderr_watcher{error_pipe[0], pipe_reader(error)};
- while (not stdout_closed or not stderr_closed)
+ while (not stdout_watcher.closed() and not stderr_watcher.closed())
EventManager::instance().handle_next_events(EventMode::Urgent);
}