// 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;
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)]
{
}
- [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)
{
out createdNew);
}
- [MonoTODO]
public SemaphoreSecurity GetAccessControl ()
{
- throw new NotImplementedException ();
+ return new SemaphoreSecurity (SafeWaitHandle,
+ AccessControlSections.Owner |
+ AccessControlSections.Group |
+ AccessControlSections.Access);
}
[PrePrepareMethod]
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);
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