Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKelly Washington <kelly@lindenlab.com>2016-07-08 19:06:44 +0300
committerKelly Washington <kelly@lindenlab.com>2016-07-08 19:06:44 +0300
commit436c2cf1b39f50a17efe7a1e1cc1ae75286fa641 (patch)
treebe35ad8364c82207818ffc6963455315de97b68c /mcs/class/Mono.Tasklets
parent38a299e0114384e4eb5e3969b7098d9ecbebbb99 (diff)
Add microthreading test to ContinuationsTest
Diffstat (limited to 'mcs/class/Mono.Tasklets')
-rw-r--r--mcs/class/Mono.Tasklets/Test/Mono.Tasklets/ContinuationsTest.cs96
1 files changed, 94 insertions, 2 deletions
diff --git a/mcs/class/Mono.Tasklets/Test/Mono.Tasklets/ContinuationsTest.cs b/mcs/class/Mono.Tasklets/Test/Mono.Tasklets/ContinuationsTest.cs
index 5f75664666b..d0b2de65429 100644
--- a/mcs/class/Mono.Tasklets/Test/Mono.Tasklets/ContinuationsTest.cs
+++ b/mcs/class/Mono.Tasklets/Test/Mono.Tasklets/ContinuationsTest.cs
@@ -29,11 +29,13 @@ namespace MonoTests.System
Assert.AreEqual(total,330);
}
+ private int yields = 0;
+
[Test]
public void Yielding() {
Continuation baseCont = new Continuation();
Continuation taskCont = new Continuation();
- int yields = 0;
+
baseCont.Mark();
taskCont.Mark();
@@ -69,12 +71,102 @@ namespace MonoTests.System
taskCont.Restore(1);
}
- Assert.AreEqual(yields,9);
+ Assert.AreEqual(9, yields);
+ }
+
+
+ public class MicroThread {
+
+ public void Yield() {
+ if (MyThread.Store(0) == 0) {
+ MainThread.Restore(1);
+ }
+ }
+
+ public void Resume() {
+ if (MainThread.Store(0) == 0) {
+ MyThread.Restore(1);
+ }
+ }
+
+ public void DoWork(Action action) {
+ if (MainThread.Store(0) == 0) {
+ action();
+ Done = true;
+ MainThread.Restore(1);
+ }
+ }
+
+ public bool Done = false;
+ public Continuation MainThread = new Continuation();
+ public Continuation MyThread = new Continuation();
+ }
+
+ public class MicroBJob {
+ private int _Count = 0;
+ public int Count {
+ get { return _Count; }
+ set { _Count = value;}
+ }
+
+ public MicroThread MicroThread;
+ public void Work() {
+ while (Count < 100) {
+ ++Count;
+ if (Count % 10 == 0) {
+ MicroThread.Yield();
+ }
+ }
+ }
}
+
+ [Test]
+ public void MicroThreadTest() {
+ MicroThread microA = new MicroThread();
+ MicroThread microB = new MicroThread();
+
+ microA.MainThread.Mark();
+ microA.MyThread.Mark();
+ microB.MainThread.Mark();
+ microB.MyThread.Mark();
+
+ Assert.AreEqual(false,microA.Done);
+ Assert.AreEqual(false,microB.Done);
+ microA.DoWork( () => {
+ int count = 0;
+ while (count < 100) {
+ ++count;
+ if (count % 10 == 0) {
+ microA.Yield();
+ }
+ }
+ });
+ MicroBJob jobB = new MicroBJob();
+ jobB.MicroThread = microB;
+
+ microB.DoWork(jobB.Work);
+
+ Assert.AreEqual(false,microA.Done);
+ Assert.AreEqual(false,microB.Done);
+
+ int yields = 0;
+ while (yields < 20) {
+ if (!microA.Done) microA.Resume();
+ if (!microB.Done) microB.Resume();
+ if (microA.Done && microB.Done) break;
+ ++yields;
+ }
+
+ Assert.AreEqual(true,microA.Done);
+ Assert.AreEqual(true,microB.Done);
+ Assert.AreEqual(100,jobB.Count);
+ Assert.AreEqual(9,yields);
+ }
}
}
+
// vim: noexpandtab
// Local Variables:
// tab-width: 4