Merge pull request #439 from mono-soc-2012/garyb/iconfix
[mono.git] / mcs / class / corlib / System.Threading / Mutex.cs
index 423b59d926a7acaa423c1561a07e08cd822f7291..61f27f00c8008b20b4db298e9bec763c103c341d 100644 (file)
 using System.Runtime.CompilerServices;
 using System.Security.Permissions;
 
-#if NET_2_0
 using System.Runtime.ConstrainedExecution;
-using System.Security.AccessControl;
 using System.IO;
+using System.Runtime.InteropServices;
+#if !NET_2_1
+using System.Security.AccessControl;
 #endif
 
 namespace System.Threading
 {
+       [ComVisible (true)]
        public sealed class Mutex : WaitHandle 
        {
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
@@ -48,9 +50,9 @@ namespace System.Threading
                                                         out bool created);
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private static extern void ReleaseMutex_internal(IntPtr handle);
+               private static extern bool ReleaseMutex_internal(IntPtr handle);
 
-#if NET_2_0
+#if !NET_2_1
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private static extern IntPtr OpenMutex_internal (string name, MutexRights rights, out MonoIOError error);
                
@@ -60,18 +62,14 @@ namespace System.Threading
                }
 #endif
                
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.MayFail)]
-#endif
                public Mutex() {
                        bool created;
                        
                        Handle=CreateMutex_internal(false, null, out created);
                }
                
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.MayFail)]
-#endif
                public Mutex(bool initiallyOwned) {
                        bool created;
                        
@@ -79,9 +77,7 @@ namespace System.Threading
                                                    out created);
                }
 
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.MayFail)]
-#endif
                [SecurityPermission (SecurityAction.LinkDemand, UnmanagedCode = true)]
                public Mutex (bool initiallyOwned, string name)
                {
@@ -89,23 +85,29 @@ namespace System.Threading
                        Handle = CreateMutex_internal (initiallyOwned, name, out created);
                }
 
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.MayFail)]
-#endif
                [SecurityPermission (SecurityAction.LinkDemand, UnmanagedCode = true)]
                public Mutex (bool initiallyOwned, string name, out bool createdNew)
                {
                        Handle = CreateMutex_internal (initiallyOwned, name, out createdNew);
                }
 
-#if NET_2_0
-               [MonoTODO ("Implement MutexSecurity")]
+#if !NET_2_1
+               [MonoTODO ("Use MutexSecurity in CreateMutex_internal")]
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.MayFail)]
                public Mutex (bool initiallyOwned, string name, out bool createdNew, MutexSecurity mutexSecurity)
                {
                        Handle = CreateMutex_internal (initiallyOwned, name, out createdNew);
                }
 
+               public MutexSecurity GetAccessControl ()
+               {
+                       return new MutexSecurity (SafeWaitHandle,
+                                                 AccessControlSections.Owner |
+                                                 AccessControlSections.Group |
+                                                 AccessControlSections.Access);
+               }
+
                public static Mutex OpenExisting (string name)
                {
                        return(OpenExisting (name, MutexRights.Synchronize |
@@ -140,11 +142,22 @@ namespace System.Threading
                }
 #endif
 
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.MayFail)]
-#endif 
                public void ReleaseMutex() {
-                       ReleaseMutex_internal(Handle);
+                       bool success = ReleaseMutex_internal(Handle);
+                       if (!success) {
+                               throw new ApplicationException ("Mutex is not owned");
+                       }
                }
+
+#if !NET_2_1
+               public void SetAccessControl (MutexSecurity mutexSecurity)
+               {
+                       if (null == mutexSecurity)
+                               throw new ArgumentNullException ("mutexSecurity");
+                               
+                       mutexSecurity.PersistModifications (SafeWaitHandle);
+               }
+#endif
        }
 }