summaryrefslogtreecommitdiff
path: root/src/buffer_utils.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-05-15 19:11:59 +0100
committerMaxime Coste <frrrwww@gmail.com>2014-05-15 19:11:59 +0100
commitaa481791312f19fa7aa42412fa0d8d9c5d653c89 (patch)
tree34ac3da742288aa2b0b3179576b81c9180897baa /src/buffer_utils.cc
parent34e1c2ddd50fa70ecce19556cb812d135e099c26 (diff)
read all available text in fifo each time the fd is signaled
Diffstat (limited to 'src/buffer_utils.cc')
-rw-r--r--src/buffer_utils.cc39
1 files changed, 26 insertions, 13 deletions
diff --git a/src/buffer_utils.cc b/src/buffer_utils.cc
index 9f5892c2..f05db777 100644
--- a/src/buffer_utils.cc
+++ b/src/buffer_utils.cc
@@ -2,6 +2,8 @@
#include "event_manager.hh"
+#include <sys/select.h>
+
namespace Kakoune
{
@@ -27,30 +29,41 @@ Buffer* create_fifo_buffer(String name, int fd, bool scroll)
Buffer* buffer = new Buffer(std::move(name), Buffer::Flags::Fifo | Buffer::Flags::NoUndo);
auto watcher = new FDWatcher(fd, [buffer, scroll](FDWatcher& watcher) {
- constexpr size_t buffer_size = 1024 * 16;
+ constexpr size_t buffer_size = 2048;
char data[buffer_size];
- ssize_t count = read(watcher.fd(), data, buffer_size);
- auto pos = buffer->end()-1;
+ const int fifo = watcher.fd();
+ timeval tv{ 0, 0 };
+ fd_set rfds;
+ ssize_t count = 0;
+ do
+ {
+ count = read(fifo, data, buffer_size);
+ auto pos = buffer->end()-1;
- bool prevent_scrolling = pos == buffer->begin() and not scroll;
- if (prevent_scrolling)
- ++pos;
+ bool prevent_scrolling = pos == buffer->begin() and not scroll;
+ if (prevent_scrolling)
+ ++pos;
- buffer->insert(pos, count > 0 ? String(data, data+count)
- : "*** kak: fifo closed ***\n");
+ buffer->insert(pos, count > 0 ? String(data, data+count)
+ : "*** kak: fifo closed ***\n");
- if (prevent_scrolling)
- {
- buffer->erase(buffer->begin(), buffer->begin()+1);
- buffer->insert(buffer->end(), "\n");
+ if (prevent_scrolling)
+ {
+ buffer->erase(buffer->begin(), buffer->begin()+1);
+ buffer->insert(buffer->end(), "\n");
+ }
+
+ FD_ZERO(&rfds);
+ FD_SET(fifo, &rfds);
}
+ while (count > 0 and select(fifo+1, &rfds, nullptr, nullptr, &tv) == 1);
if (count <= 0)
{
kak_assert(buffer->flags() & Buffer::Flags::Fifo);
buffer->flags() &= ~Buffer::Flags::Fifo;
buffer->flags() &= ~Buffer::Flags::NoUndo;
- close(watcher.fd());
+ close(fifo);
delete &watcher;
}
});