Просмотр исходного кода

2004-12-20 Sebastien Pouliot <[email protected]>

	* CompressedStack.cs: Implemented most todo so it's usable for CAS.
	* CompressedStackSwitcher.cs: Implemented most todo.
	* Thread.cs: Implement support for getting/setting CompressedStack.


svn path=/trunk/mcs/; revision=37974
Sebastien Pouliot 21 лет назад
Родитель
Сommit
c71dad3b2f

+ 6 - 0
mcs/class/corlib/System.Threading/ChangeLog

@@ -1,3 +1,9 @@
+2004-12-20  Sebastien Pouliot  <[email protected]>
+
+	* CompressedStack.cs: Implemented most todo so it's usable for CAS.
+	* CompressedStackSwitcher.cs: Implemented most todo.
+	* Thread.cs: Implement support for getting/setting CompressedStack.
+
 2004-12-15  Zoltan Varga  <[email protected]>
 
 	* Thread.cs: Change type of culture_info and ui_culture_info to 

+ 63 - 12
mcs/class/corlib/System.Threading/CompressedStack.cs

@@ -1,8 +1,9 @@
 //
 // System.Threading.Thread.cs
 //
-// Author:
-//   Zoltan Varga ([email protected])
+// Authors:
+//	Zoltan Varga ([email protected])
+//	Sebastien Pouliot  <[email protected]>
 //
 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
 //
@@ -26,8 +27,12 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
+using System.Collections;
+using System.Diagnostics;
+using System.Reflection;
 using System.Runtime.InteropServices;
 using System.Runtime.Serialization;
+using System.Security;
 
 namespace System.Threading {
 
@@ -38,9 +43,18 @@ namespace System.Threading {
 #else
 	public class CompressedStack {
 #endif
+		private ArrayList _list;
 
-		internal CompressedStack ()
+		internal CompressedStack (int length)
 		{
+			if (length > 0)
+				_list = new ArrayList (length);
+		}
+
+		internal CompressedStack (CompressedStack cs)
+		{
+			if ((cs != null) && (cs._list != null))
+				_list = (ArrayList) cs._list.Clone ();
 		}
 
 		~CompressedStack ()
@@ -48,37 +62,74 @@ namespace System.Threading {
 		}
 
 #if NET_2_0
-		[MonoTODO]
 		[ComVisibleAttribute (false)]
 		public CompressedStack CreateCopy ()
 		{
-			throw new NotImplementedException ();
+			// in 2.0 beta1 Object.ReferenceEquals (cs, cs.CreateCopy ()) == true !!!
+			return this;
+//			return new CompressedStack (this);
 		}
 
-		[MonoTODO]
+		[MonoTODO ("incomplete")]
 		public void GetObjectData (SerializationInfo info, StreamingContext context)
 		{
 			if (info == null)
 				throw new ArgumentNullException ("info");
 		}
 
-		[MonoTODO]
 		static public CompressedStack Capture ()
 		{
-			throw new NotImplementedException ();
+			CompressedStack cs = new CompressedStack (0);
+			cs._list = SecurityFrame.GetStack (1);
+			return cs;
 		}
 
-		[MonoTODO]
 		static public CompressedStack GetCompressedStack ()
 		{
-			throw new NotImplementedException ();
+			// Note: CompressedStack.GetCompressedStack doesn't return null
+			// like Thread.CurrentThread.GetCompressedStack if no compressed
+			// stack is present.
+			return new CompressedStack (Thread.CurrentThread.GetCompressedStack ());
 		}
 
-		[MonoTODO]
 		static public CompressedStackSwitcher SetCompressedStack (CompressedStack cs)
 		{
-			throw new NotImplementedException ();
+			Thread t = Thread.CurrentThread;
+			CompressedStack ctcs = t.GetCompressedStack ();
+			if (ctcs != null) {
+				string msg = Locale.GetText ("You must Undo previous CompressedStack.");
+				throw new SecurityException (msg);
+			}
+			CompressedStackSwitcher csw = new CompressedStackSwitcher (ctcs, t);
+			t.SetCompressedStack (cs);
+			return csw;
 		}
 #endif
+		internal bool Equals (CompressedStack cs)
+		{
+			if (IsEmpty ())
+				return cs.IsEmpty ();
+			if (cs.IsEmpty ())
+				return false;
+			if (_list.Count != cs._list.Count)
+				return false;
+
+			for (int i=0; i < _list.Count; i++) {
+				SecurityFrame sf1 = (SecurityFrame) _list [i];
+				SecurityFrame sf2 = (SecurityFrame) cs._list [i];
+				if (!sf1.Equals (sf2))
+					return false;
+			}
+			return true;
+		}
+
+		internal bool IsEmpty ()
+		{
+			return ((_list == null) || (_list.Count == 0));
+		}
+
+		internal IList List {
+			get { return _list; }
+		}
 	}
 }		

+ 37 - 16
mcs/class/corlib/System.Threading/CompressedStackSwitcher.cs

@@ -28,7 +28,6 @@
 
 #if NET_2_0
 
-using System;
 using System.Globalization;
 using System.Runtime.ConstrainedExecution;
 using System.Runtime.InteropServices;
@@ -38,46 +37,68 @@ namespace System.Threading {
 	[ComVisibleAttribute (false)]
 	public struct CompressedStackSwitcher : IDisposable {
 
-		private bool _undo;
+		private CompressedStack _cs;
+		private Thread _t;
+
+		internal CompressedStackSwitcher (CompressedStack cs, Thread t)
+		{
+			_cs = cs;
+			_t = t;
+		}
 
-		[MonoTODO]
 		public override bool Equals (object obj)
 		{
+			if (obj == null)
+				return false;
+
+			if (obj is CompressedStackSwitcher)
+				return op_Equality (this, (CompressedStackSwitcher)obj);
+
 			return false;
 		}
 
-		[MonoTODO]
 		public override int GetHashCode ()
 		{
-			return 0;
+			// documented as always the same for all instances
+			return typeof (CompressedStackSwitcher).GetHashCode ();
+			// Microsoft seems to return 1404280835 every time 
+			// (even between executions).
 		}
 
-		[MonoTODO]
 		[ReliabilityContract (Consistency.WillNotCorruptState, CER.MayFail)]
 		public void Undo ()
 		{
-			_undo = true;
+			if ((_cs != null) && (_t != null)) {
+				lock (_cs) {
+					if ((_cs != null) && (_t != null)) {
+						_t.SetCompressedStack (_cs);
+					}
+					_t = null;
+					_cs = null;
+				}
+			}
 		}
 
-// LAMESPEC: documented but not implemented (not shown by corcompare)
-#if false
-		[MonoTODO]
 		public static bool op_Equality (CompressedStackSwitcher c1, CompressedStackSwitcher c2)
 		{
-			return false;
+			if (c1._cs == null)
+				return (c2._cs == null);
+			if (c2._cs == null)
+				return false;
+
+			if (c1._t.ManagedThreadId != c2._t.ManagedThreadId)
+				return false;
+			return c1._cs.Equals (c2._cs);
 		}
 
-		[MonoTODO]
 		public static bool op_Inequality (CompressedStackSwitcher c1, CompressedStackSwitcher c2)
 		{
-			return false;
+			return !op_Equality (c1, c2);
 		}
-#endif
 
 		void IDisposable.Dispose () 
 		{
-			if (!_undo)
-				Undo ();
+			Undo ();
 		}
 	}
 }

+ 13 - 5
mcs/class/corlib/System.Threading/Thread.cs

@@ -40,6 +40,7 @@ using System.Globalization;
 using System.Runtime.CompilerServices;
 using System.IO;
 using System.Collections;
+using System.Security;
 
 #if NET_2_0
 using System.Runtime.ConstrainedExecution;
@@ -89,6 +90,8 @@ namespace System.Threading
 		private string thread_name=null;
 		
 		private IPrincipal _principal;
+
+		private CompressedStack _stack;
 		
 		public static Context CurrentContext {
 			get {
@@ -901,16 +904,17 @@ namespace System.Threading
 			}
 		}
 
-		[MonoTODO]
 		public CompressedStack GetCompressedStack ()
 		{
-			throw new NotImplementedException ();
+			// Note: returns null if no CompressedStack has been set.
+			// However CompressedStack.GetCompressedStack returns an 
+			// (empty?) CompressedStack instance.
+			return _stack;
 		}
 
-		[MonoTODO]
 		public void SetCompressedStack (CompressedStack stack)
 		{
-			throw new NotImplementedException ();
+			_stack = stack;
 		}
 
 		[ComVisible (false)]
@@ -925,8 +929,12 @@ namespace System.Threading
 		{
 			throw new NotImplementedException ();
 		}
+#else
+		internal CompressedStack GetCompressedStack ()
+		{
+			return _stack;
+		}
 #endif
-		
 	}
 }