test new exception mechanism in multithreaded environment
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6970 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
ab006f5428
commit
ffa8942be1
2 changed files with 73 additions and 0 deletions
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Threading;
|
||||||
using csharp_exceptionsNamespace;
|
using csharp_exceptionsNamespace;
|
||||||
|
|
||||||
public class runme
|
public class runme
|
||||||
|
|
@ -183,8 +184,59 @@ public class runme
|
||||||
}
|
}
|
||||||
if (csharp_exceptions.exception_macro_run_flag)
|
if (csharp_exceptions.exception_macro_run_flag)
|
||||||
throw new Exception("exceptionmacrotest was executed");
|
throw new Exception("exceptionmacrotest was executed");
|
||||||
|
|
||||||
|
// exceptions in multiple threads test
|
||||||
|
{
|
||||||
|
ThrowsClass throwsClass = new ThrowsClass(1234.5678);
|
||||||
|
const int NUM_THREADS = 8;
|
||||||
|
Thread[] threads = new Thread[NUM_THREADS];
|
||||||
|
TestThread[] testThreads = new TestThread[NUM_THREADS];
|
||||||
|
// invoke the threads
|
||||||
|
for (int i=0; i<NUM_THREADS; i++) {
|
||||||
|
testThreads[i] = new TestThread(throwsClass, i);
|
||||||
|
threads[i] = new Thread(new ThreadStart(testThreads[i].Run));
|
||||||
|
threads[i].Start();
|
||||||
|
}
|
||||||
|
// wait for the threads to finish
|
||||||
|
for (int i=0; i<NUM_THREADS; i++) {
|
||||||
|
threads[i].Join();
|
||||||
|
}
|
||||||
|
for (int i=0; i<NUM_THREADS; i++) {
|
||||||
|
if (testThreads[i].Failed) throw new Exception("Test Failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class TestThread {
|
||||||
|
private int threadId;
|
||||||
|
private ThrowsClass throwsClass;
|
||||||
|
public bool Failed;
|
||||||
|
public TestThread(ThrowsClass t, int id) {
|
||||||
|
throwsClass = t;
|
||||||
|
threadId = id;
|
||||||
|
}
|
||||||
|
public void Run() {
|
||||||
|
Failed = false;
|
||||||
|
try {
|
||||||
|
for (int i=0; i<4000; i++) { // run test for about 10 seconds on a 1GHz machine
|
||||||
|
try {
|
||||||
|
throwsClass.ThrowException(i);
|
||||||
|
throw new Exception("No exception thrown");
|
||||||
|
} catch (ArgumentOutOfRangeException e) {
|
||||||
|
String expectedMessage = "Argument is out of range.\nParameter name: " + i;
|
||||||
|
if (e.Message != expectedMessage) {
|
||||||
|
throw new Exception("Exception message incorrect. Expected:\n[" + expectedMessage + "]\n" + "Received:\n[" + e.Message + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (throwsClass.dub != 1234.5678) // simple check which attempts to catch memory corruption
|
||||||
|
throw new Exception("throwsException.dub = " + throwsClass.dub + " expected: 1234.5678");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
Console.Error.WriteLine("Test failed (thread " + threadId + "): " + e.Message);
|
||||||
|
Failed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -155,3 +155,24 @@ unsigned short ushorttest() { return 100; }
|
||||||
exception_macro_run_flag = true;
|
exception_macro_run_flag = true;
|
||||||
}
|
}
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
// exceptions in multiple threads test
|
||||||
|
%exception ThrowsClass::ThrowException(long long input) {
|
||||||
|
try {
|
||||||
|
$action
|
||||||
|
} catch (long long d) {
|
||||||
|
char message[64];
|
||||||
|
sprintf(message, "%lld", d);
|
||||||
|
SWIG_CSharpSetPendingException(SWIG_CSharpArgumentOutOfRangeException, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%inline %{
|
||||||
|
struct ThrowsClass {
|
||||||
|
double dub;
|
||||||
|
ThrowsClass(double d) : dub(d) {}
|
||||||
|
long long ThrowException(long long input) {
|
||||||
|
throw input;
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
%}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue