summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--input/input.c15
-rw-r--r--osdep/io.c25
-rw-r--r--osdep/io.h1
3 files changed, 28 insertions, 13 deletions
diff --git a/input/input.c b/input/input.c
index 299657f335..44360e05ec 100644
--- a/input/input.c
+++ b/input/input.c
@@ -1492,20 +1492,9 @@ struct input_ctx *mp_input_init(struct mpv_global *global)
}
#ifndef __MINGW32__
- int ret = pipe(ictx->wakeup_pipe);
- if (ret == 0) {
- for (int i = 0; i < 2 && ret >= 0; i++) {
- mp_set_cloexec(ictx->wakeup_pipe[i]);
- ret = fcntl(ictx->wakeup_pipe[i], F_GETFL);
- if (ret < 0)
- break;
- ret = fcntl(ictx->wakeup_pipe[i], F_SETFL, ret | O_NONBLOCK);
- if (ret < 0)
- break;
- }
- }
+ int ret = mp_make_wakeup_pipe(ictx->wakeup_pipe);
if (ret < 0)
- MP_ERR(ictx, "Failed to initialize wakeup pipe: %s\n", strerror(errno));
+ MP_ERR(ictx, "Failed to initialize wakeup pipe: %s\n", strerror(-ret));
else
mp_input_add_fd(ictx, ictx->wakeup_pipe[0], true, NULL, read_wakeup,
NULL, NULL);
diff --git a/osdep/io.c b/osdep/io.c
index 807ec0a0d0..27235e092c 100644
--- a/osdep/io.c
+++ b/osdep/io.c
@@ -19,6 +19,7 @@
*/
#include <unistd.h>
+#include <errno.h>
#include "talloc.h"
@@ -41,6 +42,30 @@ bool mp_set_cloexec(int fd)
return true;
}
+#ifdef __MINGW32__
+int mp_make_wakeup_pipe(int pipes[2])
+{
+ pipes[0] = pipes[1] = -1;
+ return -ENOSYS;
+}
+#else
+// create a pipe, and set it to non-blocking (and also set FD_CLOEXEC)
+int mp_make_wakeup_pipe(int pipes[2])
+{
+ if (pipe(pipes) != 0) {
+ pipes[0] = pipes[1] = -1;
+ return -errno;
+ }
+
+ for (int i = 0; i < 2; i++) {
+ mp_set_cloexec(pipes[i]);
+ int val = fcntl(pipes[i], F_GETFL) | O_NONBLOCK;
+ fcntl(pipes[i], F_SETFL, val);
+ }
+ return 0;
+}
+#endif
+
#ifdef _WIN32
#include <windows.h>
diff --git a/osdep/io.h b/osdep/io.h
index 53097a1b78..306e2ac6ec 100644
--- a/osdep/io.h
+++ b/osdep/io.h
@@ -44,6 +44,7 @@
#endif
bool mp_set_cloexec(int fd);
+int mp_make_wakeup_pipe(int pipes[2]);
#ifdef _WIN32
#include <wchar.h>