summaryrefslogtreecommitdiffstats
path: root/osdep
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-04-15 22:43:02 +0200
committerwm4 <wm4@nowhere>2015-04-15 22:43:02 +0200
commitd55c41501f3500d5d301f3cb4ea5c40816f9baae (patch)
treecc1d83e6b2b5d8f6c8d2f126907dca9f61a374d3 /osdep
parent95c1487c93b2193680c5e0f064bbb8fb3b71ff2c (diff)
downloadmpv-d55c41501f3500d5d301f3cb4ea5c40816f9baae.tar.bz2
mpv-d55c41501f3500d5d301f3cb4ea5c40816f9baae.tar.xz
subprocess: move implementation for deatched subprocesses
Diffstat (limited to 'osdep')
-rw-r--r--osdep/subprocess.c57
-rw-r--r--osdep/subprocess.h3
2 files changed, 60 insertions, 0 deletions
diff --git a/osdep/subprocess.c b/osdep/subprocess.c
new file mode 100644
index 0000000000..84a1b52fe6
--- /dev/null
+++ b/osdep/subprocess.c
@@ -0,0 +1,57 @@
+/*
+ * This file is part of mpv.
+ *
+ * mpv is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * mpv is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with mpv. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <pthread.h>
+
+#include "common/common.h"
+#include "common/msg.h"
+#include "common/msg_control.h"
+
+#include "subprocess.h"
+
+struct subprocess_args {
+ struct mp_log *log;
+ char **args;
+};
+
+static void *run_subprocess(void *ptr)
+{
+ struct subprocess_args *p = ptr;
+ pthread_detach(pthread_self());
+
+ mp_msg_flush_status_line(p->log);
+
+ char *err = NULL;
+ if (mp_subprocess(p->args, NULL, NULL, NULL, NULL, &err) < 0)
+ mp_err(p->log, "Running subprocess failed: %s\n", err);
+
+ talloc_free(p);
+ return NULL;
+}
+
+void mp_subprocess_detached(struct mp_log *log, char **args)
+{
+ struct subprocess_args *p = talloc_zero(NULL, struct subprocess_args);
+ p->log = mp_log_new(p, log, NULL);
+ int num_args = 0;
+ for (int n = 0; args[n]; n++)
+ MP_TARRAY_APPEND(p, p->args, num_args, talloc_strdup(p, args[n]));
+ MP_TARRAY_APPEND(p, p->args, num_args, NULL);
+ pthread_t thread;
+ if (pthread_create(&thread, NULL, run_subprocess, p))
+ talloc_free(p);
+}
diff --git a/osdep/subprocess.h b/osdep/subprocess.h
index 09c07da981..1bd5afe1f8 100644
--- a/osdep/subprocess.h
+++ b/osdep/subprocess.h
@@ -29,4 +29,7 @@ int mp_subprocess(char **args, struct mp_cancel *cancel, void *ctx,
subprocess_read_cb on_stdout, subprocess_read_cb on_stderr,
char **error);
+struct mp_log;
+void mp_subprocess_detached(struct mp_log *log, char **args);
+
#endif