0
0
mirror of https://github.com/mpv-player/mpv.git synced 2024-09-20 03:52:22 +02:00

Avoid calling close(-1)

While this is perfectly OK on Unix, it causes annoying valgrind
warnings, and might be otherwise confusing to others.

On Windows, the runtime can actually abort the process if this is
called.

push.c part taken from a patch by Pedro Pombeiro.
This commit is contained in:
wm4 2017-06-27 14:22:28 +02:00
parent 7eca787571
commit cd25d98bfa
6 changed files with 41 additions and 28 deletions

View File

@ -423,8 +423,11 @@ static void destroy_no_thread(struct ao *ao)
ao->driver->uninit(ao);
for (int n = 0; n < 2; n++)
close(p->wakeup_pipe[n]);
for (int n = 0; n < 2; n++) {
int h = p->wakeup_pipe[n];
if (h >= 0)
close(h);
}
pthread_cond_destroy(&p->wakeup);
pthread_mutex_destroy(&p->lock);

View File

@ -402,8 +402,10 @@ struct mp_ipc_ctx *mp_init_ipc(struct mp_client_api *client_api,
return arg;
out:
close(arg->death_pipe[0]);
close(arg->death_pipe[1]);
if (arg->death_pipe[0] >= 0) {
close(arg->death_pipe[0]);
close(arg->death_pipe[1]);
}
talloc_free(arg);
return NULL;
}

View File

@ -32,6 +32,8 @@
extern char **environ;
#define SAFE_CLOSE(fd) do { if ((fd) >= 0) close((fd)); (fd) = -1; } while (0)
// A silly helper: automatically skips entries with negative FDs
static int sparse_poll(struct pollfd *fds, int num_fds, int timeout)
{
@ -93,12 +95,9 @@ int mp_subprocess(char **args, struct mp_cancel *cancel, void *ctx,
}
spawned = true;
close(p_stdout[1]);
p_stdout[1] = -1;
close(p_stderr[1]);
p_stderr[1] = -1;
close(devnull);
devnull = -1;
SAFE_CLOSE(p_stdout[1]);
SAFE_CLOSE(p_stderr[1]);
SAFE_CLOSE(devnull);
int *read_fds[2] = {&p_stdout[0], &p_stderr[0]};
subprocess_read_cb read_cbs[2] = {on_stdout, on_stderr};
@ -119,10 +118,8 @@ int mp_subprocess(char **args, struct mp_cancel *cancel, void *ctx,
continue;
if (r > 0 && read_cbs[n])
read_cbs[n](ctx, buf, r);
if (r <= 0) {
close(*read_fds[n]);
*read_fds[n] = -1;
}
if (r <= 0)
SAFE_CLOSE(*read_fds[n]);
}
}
if (fds[2].revents) {
@ -141,11 +138,11 @@ int mp_subprocess(char **args, struct mp_cancel *cancel, void *ctx,
done:
if (fa_destroy)
posix_spawn_file_actions_destroy(&fa);
close(p_stdout[0]);
close(p_stdout[1]);
close(p_stderr[0]);
close(p_stderr[1]);
close(devnull);
SAFE_CLOSE(p_stdout[0]);
SAFE_CLOSE(p_stdout[1]);
SAFE_CLOSE(p_stderr[0]);
SAFE_CLOSE(p_stderr[1]);
SAFE_CLOSE(devnull);
if (!spawned || (WIFEXITED(status) && WEXITSTATUS(status) == 127)) {
*error = "init";

View File

@ -368,7 +368,16 @@ static void continue_sighandler(int signum)
static pthread_t input_thread;
static struct input_ctx *input_ctx;
static int death_pipe[2];
static int death_pipe[2] = {-1, -1};
static void close_death_pipe(void)
{
for (int n = 0; n < 2; n++) {
if (death_pipe[n] >= 0)
close(death_pipe[n]);
death_pipe[n] = -1;
}
}
static void quit_request_sighandler(int signum)
{
@ -421,8 +430,7 @@ void terminal_setup_getch(struct input_ctx *ictx)
if (pthread_create(&input_thread, NULL, terminal_thread, NULL)) {
input_ctx = NULL;
close(death_pipe[0]);
close(death_pipe[1]);
close_death_pipe();
return;
}
@ -450,8 +458,7 @@ void terminal_uninit(void)
if (input_ctx) {
(void)write(death_pipe[1], &(char){0}, 1);
pthread_join(input_thread, NULL);
close(death_pipe[0]);
close(death_pipe[1]);
close_death_pipe();
input_ctx = NULL;
}

View File

@ -885,8 +885,10 @@ struct mp_cancel {
static void cancel_destroy(void *p)
{
struct mp_cancel *c = p;
close(c->wakeup_pipe[0]);
close(c->wakeup_pipe[1]);
if (c->wakeup_pipe[0] >= 0) {
close(c->wakeup_pipe[0]);
close(c->wakeup_pipe[1]);
}
}
struct mp_cancel *mp_cancel_new(void *talloc_ctx)

View File

@ -762,8 +762,10 @@ void vo_x11_uninit(struct vo *vo)
sem_destroy(&x11->screensaver_sem);
}
for (int n = 0; n < 2; n++)
close(x11->wakeup_pipe[n]);
if (x11->wakeup_pipe[0] >= 0) {
close(x11->wakeup_pipe[0]);
close(x11->wakeup_pipe[1]);
}
talloc_free(x11);
vo->x11 = NULL;