2009-01-08 Rodrigo Kumpera <rkumpera@novell.com>
authorRodrigo Kumpera <kumpera@gmail.com>
Thu, 8 Jan 2009 12:52:49 +0000 (12:52 -0000)
committerRodrigo Kumpera <kumpera@gmail.com>
Thu, 8 Jan 2009 12:52:49 +0000 (12:52 -0000)
* signal.c: Don't allow registration of a realtime signal to happen
if it was already registered outside of Mono.Posix.

svn path=/trunk/mono/; revision=122755

support/ChangeLog
support/signal.c

index 0b87065493d58f10996448e25b41a84dee71d85a..aaff237409c28e352911175311435f1b29a1e05d 100644 (file)
@@ -1,3 +1,8 @@
+2009-01-08  Rodrigo Kumpera  <rkumpera@novell.com>
+
+       * signal.c: Don't allow registration of a realtime signal to happen
+       if it was already registered outside of Mono.Posix.
+
 2008-12-19  Jonathan Pryor  <jpryor@novell.com>
 
        * signal.c: Improve error checking within Mono_Posix_FromRealTimeSignum.
index 28498285457011e3d86d7e4e6748a659373980a7..c6df230b1b7ebba017835d6f96378f9b3fa1978c 100644 (file)
@@ -29,6 +29,8 @@ G_BEGIN_DECLS
 typedef void (*mph_sighandler_t)(int);
 typedef struct Mono_Unix_UnixSignal_SignalInfo signal_info;
 
+static int count_handlers (int signum);
+
 void*
 Mono_Posix_Stdlib_SIG_DFL (void)
 {
@@ -157,6 +159,19 @@ Mono_Unix_UnixSignal_install (int sig)
                return NULL;
        }
 
+#if defined (SIGRTMIN) && defined (SIGRTMAX)
+       /*The runtime uses some rt signals for itself so it's important to not override them.*/
+       if (sig >= SIGRTMIN && sig <= SIGRTMAX && count_handlers (sig) == 0) {
+               struct sigaction sinfo;
+               sigaction (sig, NULL, &sinfo);
+               if (sinfo.sa_handler != SIG_DFL || (void*)sinfo.sa_sigaction != (void*)SIG_DFL) {
+                       pthread_mutex_unlock (&signals_mutex);
+                       errno = EADDRINUSE;
+                       return NULL;
+               }
+       }
+#endif /*defined (SIGRTMIN) && defined (SIGRTMAX)*/
+
        for (i = 0; i < NUM_SIGNALS; ++i) {
                if (h == NULL && signals [i].signum == 0) {
                        h = &signals [i];