mirror of
https://github.com/mpv-player/mpv
synced 2024-12-29 10:32:15 +00:00
7eca787571
In a bunch of cases, we emulate highly platform specific APIs on a higher level across all OSes, such as IPC, terminal, subprocess handling, and more. We have source files for each OS, and they implement all the same mpv internal API. Selecting which source file to use on an OS can be tricky, because there is partially overlapping and emulated APIs (consider Cygwin on Windows). Add a pick_first_matching_dep() function to make this slightly easier and more structured. Also add dummy backends in some cases, to deal with APIs not being available. Clarify the Windows dependency identifiers, as these are the most confusing.
64 lines
1.7 KiB
C
64 lines
1.7 KiB
C
/*
|
|
* This file is part of mpv.
|
|
*
|
|
* mpv is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 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 Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with mpv. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <pthread.h>
|
|
|
|
#include "config.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_devnull(void *ctx, char *data, size_t size)
|
|
{
|
|
}
|
|
|
|
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);
|
|
}
|