Explorar o código

Apply Gert's version of the AutoResetEvent, and merge his test
into NUnit.

Test3 is known to be buggy (no harm, as our code just reports a
warning from the iolayer)


svn path=/trunk/mcs/; revision=82419

Miguel de Icaza %!s(int64=18) %!d(string=hai) anos
pai
achega
6bf8dcac58

+ 10 - 10
mcs/class/corlib/System.Threading/WaitHandle.cs

@@ -221,11 +221,8 @@ namespace System.Threading
 			[SecurityPermission (SecurityAction.LinkDemand, UnmanagedCode = true)]
 			[SecurityPermission (SecurityAction.InheritanceDemand, UnmanagedCode = true)]
 			set {
-				if (safe_wait_handle != null)
-					safe_wait_handle.Close ();
-
 				if (value == InvalidHandle)
-					safe_wait_handle = null;
+					safe_wait_handle = new SafeWaitHandle (InvalidHandle, false);
 				else
 					safe_wait_handle = new SafeWaitHandle (value, true);
 			}
@@ -241,7 +238,7 @@ namespace System.Threading
 
 				//
 				// This is only the case if the handle was never properly initialized
-				// most likely a but in the derived class
+				// most likely a bug in the derived class
 				//
 				if (safe_wait_handle == null)
 					return;
@@ -261,19 +258,21 @@ namespace System.Threading
 
 			[ReliabilityContract (Consistency.WillNotCorruptState, Cer.Success)]
 			set {
-				if (safe_wait_handle != null)
-					safe_wait_handle.Dispose ();
-
-				safe_wait_handle = value;
+				if (value == null)
+					safe_wait_handle = new SafeWaitHandle (InvalidHandle, false);
+				else
+					safe_wait_handle = value;
 			}
 		}
 
+		[MonoTODO]
 		public static bool SignalAndWait (WaitHandle toSignal,
 						  WaitHandle toWaitOn)
 		{
 			throw new NotImplementedException ();
 		}
 		
+		[MonoTODO]
 		public static bool SignalAndWait (WaitHandle toSignal,
 						  WaitHandle toWaitOn,
 						  int millisecondsTimeout,
@@ -282,6 +281,7 @@ namespace System.Threading
 			throw new NotImplementedException ();
 		}
 		
+		[MonoTODO]
 		public static bool SignalAndWait (WaitHandle toSignal,
 						  WaitHandle toWaitOn,
 						  TimeSpan timeout,
@@ -422,7 +422,7 @@ namespace System.Threading
 		}
 #endif
 
-		protected static readonly IntPtr InvalidHandle = IntPtr.Zero;
+		protected static readonly IntPtr InvalidHandle = (IntPtr) (-1);
 		bool disposed = false;
 
 		void IDisposable.Dispose() {

+ 97 - 1
mcs/class/corlib/Test/System.Threading/AutoResetEventTest.cs

@@ -3,13 +3,18 @@
 //
 // Author:
 // 	Gonzalo Paniagua Javier ([email protected])
+//      Gert Driesen <[email protected]>
 //
-// (C) 2005 Novell, Inc (http://www.novell.com)
+// Copyright 2005 Novell, Inc (http://www.novell.com)
+// Copyright 2007 Gert Driesen
 //
 
 using NUnit.Framework;
 using System;
 using System.Threading;
+#if NET_2_0
+using Microsoft.Win32.SafeHandles;
+#endif
 
 namespace MonoTests.System.Threading {
 
@@ -26,5 +31,96 @@ namespace MonoTests.System.Threading {
 			Assertion.AssertEquals ("#03", false, evt.WaitOne (1000, false));
 		}
 	}
+
+#if NET_2_0
+	[TestFixture]
+	public class AutoResetEvent_SafeHandles : Assertion {
+
+		//
+		// Verifies that the safe SafeWaitHandle is used even when Handle is set
+		//
+		[Test]
+		public void SafeWaitHandleIdentity ()
+		{
+			AutoResetEvent are1 = new AutoResetEvent (false);
+			AutoResetEvent are2 = new AutoResetEvent (false);
+			SafeWaitHandle swh1 = are1.SafeWaitHandle;
+			Assertion.AssertEquals ("#A1:", false, swh1.IsClosed);
+			Assertion.AssertEquals ("#A2:", false, swh1.IsInvalid);
+			IntPtr dummyHandle = (IntPtr) 2;
+			are1.Handle = dummyHandle;
+			Assertion.AssertEquals ("#A3:", true, (are1.Handle == dummyHandle));
+			Assertion.AssertEquals ("#A4:", false, swh1.IsClosed);
+			Assertion.AssertEquals ("#A5:", false, swh1.IsClosed);
+			Assertion.AssertEquals ("#A6:", false, swh1.IsInvalid);
+			Assertion.AssertEquals ("#A7:", false, are1.SafeWaitHandle.IsClosed);
+			Assertion.AssertEquals ("#A8:", false, are1.SafeWaitHandle.IsInvalid);
+			are1.Close ();
+			are2.Close ();
+			swh1.Dispose ();
+		}
+
+		[Test]
+	        public void Test2 ()
+	        {
+	                AutoResetEvent are1 = new AutoResetEvent (false);
+	                are1.SafeWaitHandle = null;
+	                Assertion.AssertEquals ("#B1:", true, (are1.SafeWaitHandle != null));
+	                Assertion.AssertEquals ("#B2:", true, (((int) are1.Handle) == -1));
+	                Assertion.AssertEquals ("#B3:", true, are1.SafeWaitHandle.IsInvalid);
+	                Assertion.AssertEquals ("#B4:", false, are1.SafeWaitHandle.IsClosed);
+	        }
+
+		[Test]
+	        public void Test3 ()
+	        {
+	                AutoResetEvent are1 = new AutoResetEvent (false);
+	                AutoResetEvent are2 = new AutoResetEvent (false);
+	                SafeWaitHandle swh1 = are1.SafeWaitHandle;
+	                SafeWaitHandle swh2 = are2.SafeWaitHandle;
+			Assertion.AssertEquals ("#C1:", true,  (swh1 != swh2));
+			Assertion.AssertEquals ("#C2:", true, (are1.SafeWaitHandle == swh1));
+	                are1.Handle = are2.Handle;
+	                Assertion.AssertEquals ("#C3:", true, (are1.SafeWaitHandle != swh1));
+	                Assertion.AssertEquals ("#C4:", false, swh1.IsClosed);
+	                Assertion.AssertEquals ("#C5:", false, swh1.IsInvalid);
+	                swh1.Dispose ();
+	                are1.Close ();
+	                are2.Close ();
+	        }
+
+		[Test]
+	        public void Test4 ()
+	        {
+	                AutoResetEvent are1 = new AutoResetEvent (false);
+	                SafeWaitHandle swh1 = are1.SafeWaitHandle;
+	                are1.Handle = (IntPtr) (-1);
+	                Assertion.AssertEquals ("#D1:" , true, swh1 != are1.SafeWaitHandle);
+	                Assertion.AssertEquals ("#D2:" , false, are1.SafeWaitHandle.IsClosed);
+	                Assertion.AssertEquals ("#D3:" , true, are1.SafeWaitHandle.IsInvalid);
+	                are1.Close ();
+	                swh1.Dispose ();
+	        }
+
+		[Test]
+	        public void Test5 ()
+	        {
+	                AutoResetEvent are1 = new AutoResetEvent (false);
+	                AutoResetEvent are2 = new AutoResetEvent (false);
+	
+	                SafeWaitHandle swh1 = are1.SafeWaitHandle;
+	                Assertion.AssertEquals ("#E1:", false, swh1.IsClosed);
+			Assertion.AssertEquals ("#E2:", false, swh1.IsInvalid);
+	                are1.Handle = IntPtr.Zero;
+			Assertion.AssertEquals ("#E3:", false, swh1.IsClosed);
+	                Assertion.AssertEquals ("#E4:", false, swh1.IsInvalid);
+	                Assertion.AssertEquals ("#E5:", false, are1.SafeWaitHandle.IsClosed);
+	                Assertion.AssertEquals ("#E6:", true, are1.SafeWaitHandle.IsInvalid);
+	                are1.Close ();
+	                are2.Close ();
+	                swh1.Dispose ();
+	        }
+	}
+#endif
 }
 

+ 5 - 0
mcs/class/corlib/Test/System.Threading/ChangeLog

@@ -1,3 +1,8 @@
+2007-07-21  Miguel de Icaza  <[email protected]>
+
+	* AutoResetEventTest.cs: Integrated test based on Gert's email
+	(only the first chunk).
+
 2007-07-08  Gert Driesen  <[email protected]>
 
 	* ThreadTest.cs: Removed tests for bug #81930, since other tests can