diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2014-12-03 13:56:02 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2014-12-03 13:56:02 +0000 |
| commit | 0517a19e6d6911d8d516a7a554aad829bf78a431 (patch) | |
| tree | 482923d4fd88895598bd7c1b1dab7960f33489f4 /src/shell_manager.cc | |
| parent | def4221ac7d1850f1024217a098da8e1c368fdfd (diff) | |
Use a select based event handling and fix deadlock
Diffstat (limited to 'src/shell_manager.cc')
| -rw-r--r-- | src/shell_manager.cc | 21 |
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); } |
