127 lines
3.7 KiB
C#
127 lines
3.7 KiB
C#
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Microsoft Research Singularity
|
||
|
//
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
|
||
|
using System;
|
||
|
using System.Threading;
|
||
|
using Microsoft.Singularity.UnitTest;
|
||
|
|
||
|
namespace Microsoft.Singularity.Applications
|
||
|
{
|
||
|
internal sealed class TestSynchronize
|
||
|
{
|
||
|
private static Mutex! mutex;
|
||
|
private static AutoResetEvent! autoResetEvent;
|
||
|
private static ManualResetEvent! manualResetEvent;
|
||
|
private static AutoResetEvent! syncEvent;
|
||
|
private static Mutex! consoleLock;
|
||
|
|
||
|
private static void SyncThread()
|
||
|
{
|
||
|
Write("[2] Acquiring mutex...");
|
||
|
mutex.WaitOne();
|
||
|
Write("[2] Mutex acquired!");
|
||
|
mutex.ReleaseMutex();
|
||
|
Write("[2] Mutex released.");
|
||
|
|
||
|
Thread.Yield();
|
||
|
Thread.Yield();
|
||
|
Thread.Yield();
|
||
|
Thread.Yield();
|
||
|
Thread.Yield();
|
||
|
|
||
|
Write("[2] Setting event.");
|
||
|
autoResetEvent.Set();
|
||
|
|
||
|
Thread.Yield();
|
||
|
Thread.Yield();
|
||
|
Thread.Yield();
|
||
|
Thread.Yield();
|
||
|
Thread.Yield();
|
||
|
|
||
|
Write("[2] Waiting for notification...");
|
||
|
syncEvent.WaitOne();
|
||
|
|
||
|
Write("[2] Setting event.");
|
||
|
autoResetEvent.Set();
|
||
|
|
||
|
Write("[2] Waiting for notification...");
|
||
|
syncEvent.WaitOne();
|
||
|
|
||
|
Write("[2] Setting manual event.");
|
||
|
manualResetEvent.Set();
|
||
|
}
|
||
|
|
||
|
internal static void Run()
|
||
|
{
|
||
|
mutex = new Mutex();
|
||
|
autoResetEvent = new AutoResetEvent(false);
|
||
|
manualResetEvent = new ManualResetEvent(true);
|
||
|
syncEvent = new AutoResetEvent(false);
|
||
|
consoleLock = new Mutex();
|
||
|
|
||
|
Thread t1 = new Thread(new ThreadStart(SyncThread));
|
||
|
t1.Start();
|
||
|
|
||
|
Write("[1] Acquiring mutex...");
|
||
|
mutex.WaitOne();
|
||
|
Write("[1] Mutex acquired!");
|
||
|
Write("[1] Releasing mutex...");
|
||
|
mutex.ReleaseMutex();
|
||
|
Write("[1] Mutex released.");
|
||
|
|
||
|
Write("[1] Acquiring mutex...");
|
||
|
mutex.WaitOne();
|
||
|
Write("[1] Mutex acquired!");
|
||
|
Write("[1] Yielding (1/3).");
|
||
|
Thread.Yield();
|
||
|
Write("[1] Yielding (2/3).");
|
||
|
Thread.Yield();
|
||
|
Write("[1] Yielding (3/3).");
|
||
|
Thread.Yield();
|
||
|
Write("[1] Releasing mutex...");
|
||
|
mutex.ReleaseMutex();
|
||
|
Write("[1] Mutex released.");
|
||
|
|
||
|
Write("[1] Waiting on event.");
|
||
|
autoResetEvent.WaitOne();
|
||
|
Write("[1] Event set!");
|
||
|
|
||
|
Write("[1] Setting sync event.");
|
||
|
syncEvent.Set();
|
||
|
|
||
|
Write("[1] Waiting on event.");
|
||
|
autoResetEvent.WaitOne();
|
||
|
Write("[1] Event set!");
|
||
|
|
||
|
Write("[1] Waiting on manual event.");
|
||
|
manualResetEvent.WaitOne();
|
||
|
Write("[1] Event set!");
|
||
|
|
||
|
Write("[1] Resetting manual event.");
|
||
|
manualResetEvent.Reset();
|
||
|
|
||
|
Write("[1] Setting sync event.");
|
||
|
syncEvent.Set();
|
||
|
|
||
|
Write("[1] Waiting on manual event.");
|
||
|
manualResetEvent.WaitOne();
|
||
|
Write("[1] Event set!");
|
||
|
|
||
|
Write("[1] Waiting on manual event.");
|
||
|
manualResetEvent.WaitOne();
|
||
|
Write("[1] Event set!");
|
||
|
}
|
||
|
|
||
|
private static void Write(string text)
|
||
|
{
|
||
|
consoleLock.WaitOne();
|
||
|
Console.Write(" " + text);
|
||
|
consoleLock.ReleaseMutex();
|
||
|
}
|
||
|
}
|
||
|
}
|