* Mono.Posix.dll.sources: Add Mono.Unix.Native/RealTimeSignum.cs.
[mono.git] / mcs / class / Mono.Posix / Mono.Unix / UnixSignal.cs
index 57321ae2aa594107095d1d6f7772520b5ea07bae..9f91165b1f9f89f5fcac0aae5cc0aeae2e12f747 100644 (file)
@@ -3,6 +3,7 @@
 //
 // Authors:
 //   Jonathan Pryor (jpryor@novell.com)
+//   Tim Jenks (tim.jenks@realtimeworlds.com)
 //
 // (C) 2008 Novell, Inc.
 //
@@ -33,25 +34,52 @@ using System.Threading;
 using Mono.Unix.Native;
 
 namespace Mono.Unix {
+
        public class UnixSignal : WaitHandle {
-               private Signum signum;
+               private int signum;
                private IntPtr signal_info;
 
                public UnixSignal (Signum signum)
                {
-                       this.signum = signum;
-                       // ensure signum is a valid signal
-                       int _signum = NativeConvert.FromSignum (signum);
-                       this.signal_info = install (_signum);
+                       this.signum = NativeConvert.FromSignum (signum);
+                       this.signal_info = install (this.signum);
+                       if (this.signal_info == IntPtr.Zero) {
+                               throw new ArgumentException ("Unable to handle signal", "signum");
+                       }
+               }
+
+               public UnixSignal (Mono.Unix.Native.RealTimeSignum rtsig)
+               {
+                       signum = NativeConvert.FromRealTimeSignum (rtsig);
+                       this.signal_info = install (this.signum);
                        if (this.signal_info == IntPtr.Zero) {
                                throw new ArgumentException ("Unable to handle signal", "signum");
                        }
                }
 
                public Signum Signum {
+                       get {
+                               if (IsRealTimeSignal)
+                                       throw new InvalidOperationException ("This signal is a RealTimeSignum");
+                               return NativeConvert.ToSignum (signum); 
+                       }
+               }
+
+               public RealTimeSignum RealTimeSignum {
+                       get {
+                               if (!IsRealTimeSignal)
+                                       throw new InvalidOperationException ("This signal is not a RealTimeSignum");
+                               return NativeConvert.ToRealTimeSignum (signum-GetSIGRTMIN ());
+                       }
+               }
+
+               public bool IsRealTimeSignal {
                        get {
                                AssertValid ();
-                               return signum; 
+                               int sigrtmin = GetSIGRTMIN ();
+                               if (sigrtmin == -1)
+                                       return false;
+                               return signum >= sigrtmin;
                        }
                }
 
@@ -67,6 +95,14 @@ namespace Mono.Unix {
                                EntryPoint="Mono_Unix_UnixSignal_WaitAny")]
                private static extern int WaitAny (IntPtr[] infos, int count, int timeout);
 
+               [DllImport (Stdlib.MPH, CallingConvention=CallingConvention.Cdecl,
+                                EntryPoint="Mono_Posix_SIGRTMIN")]
+               internal static extern int GetSIGRTMIN ();
+
+               [DllImport (Stdlib.MPH, CallingConvention=CallingConvention.Cdecl,
+                                EntryPoint="Mono_Posix_SIGRTMAX")]
+               internal static extern int GetSIGRTMAX ();
+
                private void AssertValid ()
                {
                        if (signal_info == IntPtr.Zero)