aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/os/stream.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/os/stream.c')
-rw-r--r--src/nvim/os/stream.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/nvim/os/stream.c b/src/nvim/os/stream.c
index 35cb41081d..0c448872c3 100644
--- a/src/nvim/os/stream.c
+++ b/src/nvim/os/stream.c
@@ -14,13 +14,17 @@
/// @return `0` on success, or `-errno` on failure.
int stream_set_blocking(int fd, bool blocking)
{
- int flags = fcntl(fd, F_GETFL, 0);
- int err = 0;
- if (!blocking && !(flags & O_NONBLOCK)) {
- err = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
- } else if (blocking && (flags & O_NONBLOCK)) {
- err = fcntl(fd, F_SETFL, flags & ~O_NONBLOCK);
- }
- return err == -1 ? -errno : 0;
+ // Private loop to avoid conflict with existing watcher(s):
+ // uv__io_stop: Assertion `loop->watchers[w->fd] == w' failed.
+ uv_loop_t loop;
+ uv_pipe_t stream;
+ uv_loop_init(&loop);
+ uv_pipe_init(&loop, &stream, 0);
+ uv_pipe_open(&stream, fd);
+ int retval = uv_stream_set_blocking((uv_stream_t *)&stream, blocking);
+ uv_close((uv_handle_t *)&stream, NULL);
+ uv_run(&loop, UV_RUN_NOWAIT); // not necessary, but couldn't hurt.
+ uv_loop_close(&loop);
+ return retval;
}