Imported Upstream version 3.8.0

Former-commit-id: 6a76a29bd07d86e57c6c8da45c65ed5447d38a61
This commit is contained in:
Jo Shields
2014-09-04 09:07:35 +01:00
parent a575963da9
commit fe777c5c82
1062 changed files with 12460 additions and 5983 deletions

View File

@@ -196,9 +196,13 @@ namespace MonoTests.System.Runtime.CompilerServices {
if (GC.MaxGeneration == 0) /*Boehm doesn't handle ephemerons */
Assert.Ignore ("Not working on Boehm.");
var cwt = new ConditionalWeakTable <object,object> ();
List<object> keepAlive;
List<WeakReference> keys;
FillStuff (cwt, out keepAlive, out keys);
List<object> keepAlive = null;
List<WeakReference> keys = null;
Thread t = new Thread (delegate () {
FillStuff (cwt, out keepAlive, out keys);
});
t.Start ();
t.Join ();
GC.Collect ();

View File

@@ -44,14 +44,15 @@ namespace MonoTests.System.Runtime.CompilerServices
class Scheduler : TaskScheduler
{
string name;
int ic, qc;
public Scheduler (string name)
{
this.name = name;
}
public int InlineCalls { get; set; }
public int QueueCalls { get; set; }
public int InlineCalls { get { return ic; } }
public int QueueCalls { get { return qc; } }
protected override IEnumerable<Task> GetScheduledTasks ()
{
@@ -60,7 +61,7 @@ namespace MonoTests.System.Runtime.CompilerServices
protected override void QueueTask (Task task)
{
++QueueCalls;
Interlocked.Increment (ref qc);
ThreadPool.QueueUserWorkItem (o => {
TryExecuteTask (task);
});
@@ -68,7 +69,7 @@ namespace MonoTests.System.Runtime.CompilerServices
protected override bool TryExecuteTaskInline (Task task, bool taskWasPreviouslyQueued)
{
++InlineCalls;
Interlocked.Increment (ref ic);
return false;
}
}
@@ -102,6 +103,7 @@ namespace MonoTests.System.Runtime.CompilerServices
string progress;
SynchronizationContext sc;
ManualResetEvent mre;
[SetUp]
public void Setup ()
@@ -176,7 +178,7 @@ namespace MonoTests.System.Runtime.CompilerServices
Assert.IsTrue (t.Wait (3000), "#0");
Assert.AreEqual (0, t.Result, "#1");
Assert.AreEqual (0, b.InlineCalls, "#2b");
Assert.AreEqual (2, a.QueueCalls, "#3a");
Assert.IsTrue (a.QueueCalls == 1 || a.QueueCalls == 2, "#3a");
Assert.AreEqual (1, b.QueueCalls, "#3b");
}
@@ -270,12 +272,15 @@ namespace MonoTests.System.Runtime.CompilerServices
[Test]
public void CompletionOnDifferentCustomSynchronizationContext ()
{
mre = new ManualResetEvent (false);
progress = "";
var syncContext = new SingleThreadSynchronizationContext ();
SynchronizationContext.SetSynchronizationContext (syncContext);
syncContext.Post (delegate {
Go2 (syncContext);
Task t = new Task (delegate() { });
Go2 (syncContext, t);
t.Start ();
}, null);
// Custom message loop
@@ -286,21 +291,30 @@ namespace MonoTests.System.Runtime.CompilerServices
Thread.Sleep (0);
}
Assert.AreEqual ("132", progress);
Assert.AreEqual ("13xa2", progress);
}
async void Go2 (SynchronizationContext ctx)
async void Go2 (SynchronizationContext ctx, Task t)
{
await Wait2 (ctx);
await Wait2 (ctx, t);
progress += "2";
progress += "a";
if (mre.WaitOne (5000))
progress += "2";
else
progress += "b";
}
async Task Wait2 (SynchronizationContext ctx)
async Task Wait2 (SynchronizationContext ctx, Task t)
{
await Task.Delay (10); // Force block suspend/return
await t; // Force block suspend/return
ctx.Post (l => progress += "3", null);
ctx.Post (l => {
progress += "3";
mre.Set ();
progress += "x";
}, null);
progress += "1";