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)]
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);
}
#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;
out created);
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.MayFail)]
-#endif
[SecurityPermission (SecurityAction.LinkDemand, UnmanagedCode = true)]
public Mutex (bool initiallyOwned, string name)
{
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 |
}
#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
}
}