Merge pull request #3066 from alexanderkyte/pedump_sgen
[mono.git] / mcs / class / System / System.Threading / Semaphore.cs
index ec5e2abbe45387d4a8b76aaf69ebf4a6c30792a2..7ed24991865d40d873f9eb43f1b3dfdd51770678 100644 (file)
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-#if NET_2_0
-
 using System.Runtime.ConstrainedExecution;
 using System.Runtime.InteropServices;
 using System.Security.AccessControl;
+using System.Security.Permissions;
 using System.Runtime.CompilerServices;
 using System.IO;
 
@@ -40,12 +39,12 @@ namespace System.Threading {
        public sealed class Semaphore : WaitHandle {
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private static extern IntPtr CreateSemaphore_internal (
+               internal static extern IntPtr CreateSemaphore_internal (
                        int initialCount, int maximumCount, string name,
                        out bool createdNew);
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private static extern int ReleaseSemaphore_internal (
+               internal static extern int ReleaseSemaphore_internal (
                        IntPtr handle, int releaseCount, out bool fail);
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
@@ -82,7 +81,7 @@ namespace System.Threading {
                {
                }
 
-               [MonoTODO ("Does not support access control, semaphoreSecurity is ignored")]
+               [MonoTODO ("CreateSemaphore_internal does not support access control, semaphoreSecurity is ignored")]
                public Semaphore (int initialCount, int maximumCount, string name, out bool createdNew, 
                        SemaphoreSecurity semaphoreSecurity)
                {
@@ -98,10 +97,12 @@ namespace System.Threading {
                                                           out createdNew);
                }
 
-               [MonoTODO]
                public SemaphoreSecurity GetAccessControl ()
                {
-                       throw new NotImplementedException ();
+                       return new SemaphoreSecurity (SafeWaitHandle,
+                                                     AccessControlSections.Owner |
+                                                     AccessControlSections.Group |
+                                                     AccessControlSections.Access);
                }
 
                [PrePrepareMethod]
@@ -130,17 +131,17 @@ namespace System.Threading {
                        return (ret);
                }
 
-               [MonoTODO]
                public void SetAccessControl (SemaphoreSecurity semaphoreSecurity)
                {
                        if (semaphoreSecurity == null)
                                throw new ArgumentNullException ("semaphoreSecurity");
-
-                       throw new NotImplementedException ();
+                               
+                       semaphoreSecurity.PersistModifications (SafeWaitHandle);
                }
 
                // static methods
 
+#if !MOBILE
                public static Semaphore OpenExisting (string name)
                {
                        return OpenExisting (name, SemaphoreRights.Synchronize | SemaphoreRights.Modify);
@@ -168,7 +169,53 @@ namespace System.Threading {
                        
                        return(new Semaphore (handle));
                }
+
+               [SecurityPermissionAttribute (SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
+               public static bool TryOpenExisting (string name, out Semaphore result)
+               {
+                       return TryOpenExisting (name, SemaphoreRights.Synchronize | SemaphoreRights.Modify, out result);
+               }
+
+               [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
+               public static bool TryOpenExisting (string name, SemaphoreRights rights, out Semaphore result)
+               {
+                       if (name == null)
+                               throw new ArgumentNullException ("name");
+                       if ((name.Length == 0) || (name.Length > 260))
+                               throw new ArgumentException ("name", Locale.GetText ("Invalid length [1-260]."));
+                       
+                       MonoIOError error;
+                       IntPtr handle = OpenSemaphore_internal (name, rights, out error);
+
+                       if (handle == (IntPtr)null) {
+                               result = null;
+                               return false;
+                       }
+
+                       result = new Semaphore (handle);
+                       return true;
+               }
+#else
+               public static Semaphore OpenExisting (string name)
+               {
+                       throw new NotSupportedException ();
+               }
+
+               public static Semaphore OpenExisting (string name, SemaphoreRights rights)
+               {
+                       throw new NotSupportedException ();
+               }
+
+               public static bool TryOpenExisting (string name, out Semaphore result)
+               {
+                       throw new NotSupportedException ();
+               }
+
+               public static bool TryOpenExisting (string name, SemaphoreRights rights, out Semaphore result)
+               {
+                       throw new NotSupportedException ();
+               }
+#endif
        }
 }
 
-#endif