-Subproject commit 8c73c45821dfbaf20fb303db1a73f8de96c0a515
+Subproject commit ceb0582568062b7d96f3d98b65453a903fdfa6d2
PROFILE_MCS_FLAGS += \
-d:MONOTOUCH_TV
+
+NO_THREAD_ABORT=1
+NO_THREAD_SUSPEND_RESUME=1
PROFILE_MCS_FLAGS += \
-d:MONOTOUCH_WATCH
+
+NO_THREAD_ABORT=1
+NO_THREAD_SUSPEND_RESUME=1
TEST_MCS_FLAGS = $(LIB_MCS_FLAGS) -nowarn:618
+ifndef NO_THREAD_ABORT
+TEST_MCS_FLAGS += -d:MONO_FEATURE_THREAD_ABORT
+endif
+
+ifndef NO_THREAD_SUSPEND_RESUME
+TEST_MCS_FLAGS += -d:MONO_FEATURE_THREAD_SUSPEND_RESUME
+endif
+
EXTRA_DISTFILES = \
System.Web.Services.Description/web-reference.xsd \
System.Web.Services.Description/wsdl-1.1.xsd \
if (tcpListener != null) {
tcpListener.Stop ();
tcpListener = null;
+#if MONO_FEATURE_THREAD_ABORT
listenThread.Abort ();
+#else
+ listenThread.Interrupt ();
+#endif
listenThread.Join ();
listenThread = null;
}
LIB_MCS_FLAGS = -nowarn:618 -d:CONFIGURATION_2_0 $(REFERENCE_SOURCES_FLAGS) -unsafe $(RESOURCE_FILES:%=-resource:%)
TEST_MCS_FLAGS += -r:System.Configuration
+ifndef NO_THREAD_ABORT
+REFERENCE_SOURCES_FLAGS += -d:MONO_FEATURE_THREAD_ABORT
+TEST_MCS_FLAGS += -d:MONO_FEATURE_THREAD_ABORT
+endif
+
+ifndef NO_THREAD_SUSPEND_RESUME
+REFERENCE_SOURCES_FLAGS += -d:MONO_FEATURE_THREAD_SUSPEND_RESUME
+TEST_MCS_FLAGS += -d:MONO_FEATURE_THREAD_SUSPEND_RESUME
+endif
+
RESOURCE_STRINGS = ../../../external/referencesource/System/System.txt
#
Thread thread = new Thread (ReadToEnd);
thread.Start ();
if (test_evt.WaitOne (3000, false) == false) {
+#if MONO_FEATURE_THREAD_ABORT
thread.Abort ();
+#else
+ thread.Interrupt ();
+#endif
test_evt.Close ();
Assert.IsTrue (false, "Timed out");
}
Thread.Sleep (three_seconds_in_milliseconds * 3);
if (timeoutWorker.End == null) {
+#if MONO_FEATURE_THREAD_ABORT
thread.Abort ();
+#else
+ thread.Interrupt ();
+#endif
Assert.Fail ("Thread finished after triple the timeout specified has passed");
}
tcpListener = null;
if (listenSocket != null)
listenSocket.Close ();
+#if MONO_FEATURE_THREAD_ABORT
listenThread.Abort ();
+#else
+ listenThread.Interrupt ();
+#endif
listenThread.Join ();
listenThread = null;
Thread.Sleep (50);
REFERENCE_SOURCES_FLAGS += -d:FEATURE_REMOTING,MONO_COM,FEATURE_COMINTEROP,FEATURE_ROLE_BASED_SECURITY
endif
+ifndef NO_THREAD_ABORT
+REFERENCE_SOURCES_FLAGS += -d:MONO_FEATURE_THREAD_ABORT
+TEST_MCS_FLAGS += -d:MONO_FEATURE_THREAD_ABORT
+endif
+
+ifndef NO_THREAD_SUSPEND_RESUME
+REFERENCE_SOURCES_FLAGS += -d:MONO_FEATURE_THREAD_SUSPEND_RESUME
+TEST_MCS_FLAGS += -d:MONO_FEATURE_THREAD_SUSPEND_RESUME
+endif
+
WARNING_ABOUT_DISABLED_WARNING=1635
LOCAL_MCS_FLAGS = -unsafe -nostdlib -nowarn:612,618,$(WARNING_ABOUT_DISABLED_WARNING) -d:INSIDE_CORLIB,MONO_CULTURE_DATA -d:LIBC $(REFERENCE_SOURCES_FLAGS)
DEFAULT_REFERENCES =
# System.IO/DirectoryInfoTest.cs needs Mono.Posix
-TEST_MCS_FLAGS = -debug -nowarn:168,219,618,672 -unsafe -r:Mono.Posix.dll -r:System.Core.dll \
+TEST_MCS_FLAGS += -debug -nowarn:168,219,618,672 -unsafe -r:Mono.Posix.dll -r:System.Core.dll \
-define:MONO_DATACONVERTER_STATIC_METHODS $(TEST_RESX_RESOURCES:%=-resource:%)
EXTRA_DISTFILES = \
}
catch (Exception e) {
if (e is ThreadAbortException) {
+#if MONO_FEATURE_THREAD_ABORT
Thread.ResetAbort ();
+#endif
retry = 5;
ex = e;
}
catch (Exception tex)
{
byte[] data = SerializeExceptionData (tex);
+#if MONO_FEATURE_THREAD_ABORT
Thread.ResetAbort ();
+#endif
return data;
}
}
}
}
+#if MONO_FEATURE_THREAD_ABORT
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private extern static void Abort_internal (InternalThread thread, object stateInfo);
void ClearAbortReason ()
{
}
+#endif // MONO_FEATURE_THREAD_ABORT
[MethodImplAttribute (MethodImplOptions.InternalCall)]
private extern static void SpinWait_nop ();
new StackTrace (t, true);
}
+#if MONO_FEATURE_THREAD_SUSPEND_RESUME
[Test]
[Ignore ("Not supported in Mono")]
public void StackTrace_Thread_Suspended ()
t.Suspend ();
new StackTrace (t, true);
}
+#endif
[Test]
public void FrameCount ()
return (int*) 0;
}
+#if MONO_FEATURE_THREAD_ABORT
[Test] // bug #81538
public void InvokeThreadAbort ()
{
{
Thread.CurrentThread.Abort ();
}
+#endif
[Test] // bug #76541
public void ToStringByRef ()
TestUtil.WaitForNotAlive (thread1, "");\r
Assert.AreEqual (100, class1.marker);\r
} finally {\r
+#if MONO_FEATURE_THREAD_ABORT\r
thread1.Abort ();\r
+#else\r
+ thread1.Interrupt ();\r
+#endif\r
}\r
}\r
\r
\r
Assert.AreEqual (class2.id, class2.marker);\r
} finally {\r
+#if MONO_FEATURE_THREAD_ABORT\r
thread1.Abort ();\r
thread2.Abort ();\r
+#else\r
+ thread1.Interrupt ();\r
+ thread2.Interrupt ();\r
+#endif\r
}\r
}\r
\r
// test Demand by denying the caller of the required privileges
+#if MONO_FEATURE_THREAD_ABORT
[Test]
[SecurityPermission (SecurityAction.Deny, ControlThread = true)]
[ExpectedException (typeof (SecurityException))]
{
Thread.CurrentThread.Abort (new object [0]);
}
-
+#endif
+
[Test]
[SecurityPermission (SecurityAction.Deny, ControlThread = true)]
[ExpectedException (typeof (SecurityException))]
Thread.CurrentThread.Interrupt ();
}
+#if MONO_FEATURE_THREAD_ABORT
[Test]
[SecurityPermission (SecurityAction.Deny, ControlThread = true)]
[ExpectedException (typeof (SecurityException))]
{
Thread.ResetAbort ();
}
+#endif
+#if MONO_FEATURE_THREAD_SUSPEND_RESUME
[Test]
[SecurityPermission (SecurityAction.Deny, ControlThread = true)]
[ExpectedException (typeof (SecurityException))]
{
Thread.CurrentThread.Suspend ();
}
+#endif
// we use reflection to call Mutex as it's named constructors are protected by
// a LinkDemand (which will be converted into full demand, i.e. a stack walk)
{
sub_thread.Start();
Thread.Sleep (100);
+#if MONO_FEATURE_THREAD_ABORT
sub_thread.Abort();
+#else
+ sub_thread.Interrupt ();
+#endif
}
}
thread2.Start();
TestUtil.WaitForAlive (thread2, "wait2");
T2ON = true;
+#if MONO_FEATURE_THREAD_ABORT
thread1.Abort();
+#else
+ thread1.Interrupt ();
+#endif
TestUtil.WaitForNotAlive (thread1, "wait3");
T1ON = false;
+#if MONO_FEATURE_THREAD_ABORT
thread2.Abort();
+#else
+ thread2.Interrupt ();
+#endif
TestUtil.WaitForNotAlive (thread2, "wait4");
T2ON = false;
}
C2Test test1 = new C2Test();
Thread TestThread = new Thread(new ThreadStart(test1.TestMethod));
TestThread.Start();
+#if MONO_FEATURE_THREAD_ABORT
TestThread.Abort();
+#else
+ TestThread.Interrupt ();
+#endif
try {
TestThread.Start();
Assert.Fail ("#2");
}
bool started = (TestThread.ThreadState == ThreadState.Running);
Assert.AreEqual (started, test1.run, "#15 Thread Is not in the correct state: ");
+#if MONO_FEATURE_THREAD_ABORT
TestThread.Abort();
+#else
+ TestThread.Interrupt ();
+#endif
}
}
TestThread.Start();
TestUtil.WaitForAlive (TestThread, "wait5");
Assert.AreEqual (ApartmentState.MTA, TestThread.ApartmentState, "#2");
+#if MONO_FEATURE_THREAD_ABORT
TestThread.Abort();
+#else
+ TestThread.Interrupt ();
+#endif
}
[Test]
ThreadPriority before = TestThread.Priority;
Assert.AreEqual (before, after, "#41 Unexpected Priority Change: ");
} finally {
+#if MONO_FEATURE_THREAD_ABORT
TestThread.Abort();
+#else
+ TestThread.Interrupt ();
+#endif
}
}
+#if MONO_FEATURE_THREAD_ABORT
[Test]
[Category ("NotDotNet")] // on MS, Thread is still in AbortRequested state when Start is invoked
public void AbortUnstarted ()
th.Abort ();
th.Start ();
}
+#endif
[Test]
[Category ("NotDotNet")] // on MS, ThreadState is immediately Stopped after Abort
TestUtil.WaitForAliveOrStop (TestThread, "wait8");
Assert.AreEqual (ThreadPriority.Normal, TestThread.Priority, "#43 Incorrect Priority in Started thread: ");
} finally {
+#if MONO_FEATURE_THREAD_ABORT
TestThread.Abort();
+#else
+ TestThread.Interrupt ();
+#endif
}
Assert.AreEqual (ThreadPriority.Normal, TestThread.Priority, "#44 Incorrect Priority in Aborted thread: ");
}
Assert.AreEqual (ThreadPriority.Highest, TestThread.Priority, "#45E Incorrect Priority:");
}
finally {
+#if MONO_FEATURE_THREAD_ABORT
TestThread.Abort();
+#else
+ TestThread.Interrupt ();
+#endif
}
}
bool state = TestThread.IsBackground;
Assert.IsFalse (state, "#51 IsBackground not set at the default state: ");
} finally {
+#if MONO_FEATURE_THREAD_ABORT
TestThread.Abort();
+#else
+ TestThread.Interrupt ();
+#endif
}
}
try {
TestThread.Start();
} finally {
+#if MONO_FEATURE_THREAD_ABORT
TestThread.Abort();
+#else
+ TestThread.Interrupt ();
+#endif
}
if (TestThread.IsAlive) {
TestThread.Name = newname;
Assert.AreEqual (newname, TestThread.Name, "#62 Name not set when must be set: ");
} finally {
+#if MONO_FEATURE_THREAD_ABORT
TestThread.Abort();
+#else
+ TestThread.Interrupt ();
+#endif
}
}
TestThread.Start();
TestUtil.WaitForAlive (TestThread, "wait11");
} finally {
+#if MONO_FEATURE_THREAD_ABORT
TestThread.Abort();
+#else
+ TestThread.Interrupt ();
+#endif
}
}
try {
TestThread.Start();
} finally {
+#if MONO_FEATURE_THREAD_ABORT
TestThread.Abort();
+#else
+ TestThread.Interrupt ();
+#endif
}
}
thread2.Start();
thread2.Join();
} finally {
+#if MONO_FEATURE_THREAD_ABORT
thread1.Abort();
thread2.Abort();
+#else
+ thread1.Interrupt ();
+ thread2.Interrupt ();
+#endif
}
}
Assert.IsTrue (TestThread.ThreadState == ThreadState.Running || (TestThread.ThreadState & ThreadState.Unstarted) != 0,
"#102 Wrong Thread State: " + TestThread.ThreadState.ToString ());
} finally {
+#if MONO_FEATURE_THREAD_ABORT
TestThread.Abort();
+#else
+ TestThread.Interrupt ();
+#endif
}
TestUtil.WaitForNotAlive (TestThread, "wait12");
t.Start ();
t.Join ();
} catch {
+#if MONO_FEATURE_THREAD_ABORT
t.Abort ();
+#else
+ t.Interrupt ();
+#endif
}
}
t.Start ();
t.Join ();
} catch {
+#if MONO_FEATURE_THREAD_ABORT
t.Abort ();
+#else
+ t.Interrupt ();
+#endif
}
}
t.Start ();
t.Join ();
} catch {
+#if MONO_FEATURE_THREAD_ABORT
t.Abort ();
+#else
+ t.Interrupt ();
+#endif
}
}
t.Start ();
t.Join ();
} catch {
+#if MONO_FEATURE_THREAD_ABORT
t.Abort ();
+#else
+ t.Interrupt ();
+#endif
}
}
int counter = 0;
+#if MONO_FEATURE_THREAD_SUSPEND_RESUME
[Test]
public void TestSuspend ()
{
TestUtil.WaitForNotAlive (t, "wait13");
CheckIsNotRunning ("t6", t);
}
-
+#endif
+
+#if MONO_FEATURE_THREAD_SUSPEND_RESUME && MONO_FEATURE_THREAD_ABORT
[Test]
[Category("NotDotNet")] // On MS, ThreadStateException is thrown on Abort: "Thread is suspended; attempting to abort"
public void TestSuspendAbort ()
CheckIsNotRunning ("t6", t);
}
+#endif
[Test]
public void Test_Interrupt ()
if (!inited || !invoking)
return;
- if (invoke_thread != null)
+ if (invoke_thread != null) {
+#if MONO_FEATURE_THREAD_ABORT
invoke_thread.Abort ();
+#else
+ invoke_thread.Interrupt ();
+#endif
+ }
}
/// <summary>
invoke_thread = System.Threading.Thread.CurrentThread;
invoking = true;
compiled (ref retval);
+#if MONO_FEATURE_THREAD_ABORT
} catch (ThreadAbortException e){
Thread.ResetAbort ();
Console.WriteLine ("Interrupted!\n{0}", e);
+#else
+ } catch (ThreadInterruptedException e) {
+ Console.WriteLine ("Interrupted!\n{0}", e);
+#endif
} finally {
invoking = false;