|
|
@@ -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; }
|
|
|
+ }
|
|
|
}
|
|
|
}
|