2 // System.Threading.Thread.cs
5 // Zoltan Varga (vargaz@freemail.hu)
6 // Sebastien Pouliot <sebastien@ximian.com>
8 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System
.Collections
;
31 using System
.Diagnostics
;
32 using System
.Reflection
;
33 using System
.Runtime
.InteropServices
;
34 using System
.Runtime
.Serialization
;
35 using System
.Security
;
36 using System
.Security
.Permissions
;
38 namespace System
.Threading
{
41 public sealed class CompressedStack
: ISerializable
{
42 private ArrayList _list
;
44 internal CompressedStack (int length
)
47 _list
= new ArrayList (length
);
50 internal CompressedStack (CompressedStack cs
)
52 if ((cs
!= null) && (cs
._list
!= null))
53 _list
= (ArrayList
) cs
._list
.Clone ();
56 [ComVisibleAttribute (false)]
57 public CompressedStack
CreateCopy ()
59 return new CompressedStack (this);
62 public static CompressedStack
Capture ()
64 #if !FEATURE_COMPRESSEDSTACK
65 throw new NotSupportedException ();
67 CompressedStack cs
= new CompressedStack (0);
68 cs
._list
= new ArrayList ();
70 // include any current CompressedStack inside the new Capture
71 CompressedStack currentCs
= Thread
.CurrentThread
.ExecutionContext
.SecurityContext
.CompressedStack
;
72 if (currentCs
!= null) {
73 for (int i
=0; i
< currentCs
._list
.Count
; i
++)
74 cs
._list
.Add (currentCs
._list
[i
]);
80 // NOTE: This method doesn't show in the class library status page because
81 // it cannot be "found" with the StrongNameIdentityPermission for ECMA key.
84 static public CompressedStack
GetCompressedStack ()
86 #if !FEATURE_COMPRESSEDSTACK
87 throw new NotSupportedException ();
89 // Note: CompressedStack.GetCompressedStack doesn't return null
90 // like Thread.CurrentThread.GetCompressedStack if no compressed
93 CompressedStack cs
= Thread
.CurrentThread
.ExecutionContext
.SecurityContext
.CompressedStack
;
94 if (cs
== null || cs
.IsEmpty ()) {
95 cs
= CompressedStack
.Capture ();
97 cs
= cs
.CreateCopy ();
98 // merge the existing compressed stack (from a previous Thread) with the current
99 // Thread stack so we can assign "all of it" to yet another Thread
100 CompressedStack newstack
= CompressedStack
.Capture ();
101 for (int i
=0; i
< newstack
._list
.Count
; i
++)
102 cs
._list
.Add (newstack
._list
[i
]);
108 [MonoTODO ("incomplete")]
110 public void GetObjectData (SerializationInfo info
, StreamingContext context
)
113 throw new ArgumentNullException ("info");
117 static public void Run (CompressedStack compressedStack
, ContextCallback callback
, object state
)
119 #if !FEATURE_COMPRESSEDSTACK
120 throw new NotSupportedException ();
122 if (compressedStack
== null)
123 throw new ArgumentException ("compressedStack");
125 Thread t
= Thread
.CurrentThread
;
126 CompressedStack original
= null;
128 original
= t
.ExecutionContext
.SecurityContext
.CompressedStack
;
129 t
.ExecutionContext
.SecurityContext
.CompressedStack
= compressedStack
;
133 if (original
!= null)
134 t
.ExecutionContext
.SecurityContext
.CompressedStack
= original
;
140 internal bool Equals (CompressedStack cs
)
143 return cs
.IsEmpty ();
146 if (_list
.Count
!= cs
._list
.Count
)
152 internal bool IsEmpty ()
154 return ((_list
== null) || (_list
.Count
== 0));
157 internal IList List
{
158 get { return _list; }