1
/*****************************************************************************
2
* signals.c : signals handler module for vlc
3
*****************************************************************************
4
* Copyright (C) 2008 Rémi Denis-Courmont
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19
*****************************************************************************/
29
#include <vlc_common.h>
30
#include <vlc_plugin.h>
31
#include <vlc_interface.h>
33
static int Open (vlc_object_t *);
34
static void Close (vlc_object_t *);
35
static void Run (intf_thread_t *);
36
static void *SigThread (void *);
39
set_shortname (N_("Signals"));
40
set_category (CAT_INTERFACE);
41
set_subcategory (SUBCAT_INTERFACE_CONTROL);
42
set_description (N_("POSIX signals handling interface"));
43
set_capability ("interface", 0);
44
set_callbacks (Open, Close);
53
static int Open (vlc_object_t *obj)
55
intf_thread_t *intf = (intf_thread_t *)obj;
56
intf_sys_t *p_sys = malloc (sizeof (*p_sys));
64
if (pthread_create (&p_sys->thread, NULL, SigThread, obj))
75
static void Close (vlc_object_t *obj)
77
intf_thread_t *intf = (intf_thread_t *)obj;
78
intf_sys_t *p_sys = intf->p_sys;
80
pthread_cancel (p_sys->thread);
82
/* In Mac OS X up to 10.5 sigwait (among others) is not a pthread
83
* cancellation point, so we throw a dummy quit signal to end
84
* sigwait() in the sigth thread */
85
pthread_kill (p_sys->thread, SIGQUIT);
87
pthread_join (p_sys->thread, NULL);
91
static void *SigThread (void *data)
93
intf_thread_t *obj = data;
94
intf_sys_t *p_sys = obj->p_sys;
98
sigaddset (&set, SIGHUP);
99
sigaddset (&set, SIGINT);
100
sigaddset (&set, SIGQUIT);
101
sigaddset (&set, SIGTERM);
103
sigaddset (&set, SIGCHLD);
109
sigwait (&set, &signum);
112
/* In Mac OS X up to 10.5 sigwait (among others) is not a pthread
113
* cancellation point */
114
pthread_testcancel();
117
vlc_object_lock (obj);
118
p_sys->signum = signum;
119
vlc_object_signal_unlocked (obj);
120
vlc_object_unlock (obj);
124
static void Run (intf_thread_t *obj)
126
intf_sys_t *p_sys = obj->p_sys;
128
vlc_object_lock (obj);
129
while (vlc_object_alive (obj))
131
switch (p_sys->signum)
137
msg_Err (obj, "Caught %s signal, exiting...",
138
strsignal (p_sys->signum));
141
vlc_object_wait (obj);
145
vlc_object_unlock (obj);
146
vlc_object_kill (obj->p_libvlc);