singrdk/base/Applications/Tests/Bartok/muwatomic/muwatomic.cs

148 lines
4.7 KiB
C#

//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
namespace AtomicTest {
using System;
internal class Test : Object {
internal int x;
}
public class muw {
public volatile static Object o2;
public volatile static Object o3;
public static void Main(String[] args) {
bool forceGC = true;
foreach (String arg in args) {
if(arg.Equals("nogc")) {
forceGC = false;
}
}
for (int i = 0; i < 10; i ++) {
Test lo1 = new Test();
Test lo2 = new Test();
Test lo3 = new Test();
Test lo4 = new Test();
Test lock_only = new Test();
int h;
int h_in1 = 0;
int h_in2 = 0;
int v = 0;
h = lo3.GetHashCode();
h = lo4.GetHashCode();
// Read from non-inflated objects
Console.WriteLine("\n\nReading in an atomic block");
try {
v = lo1.x;
v = lo2.x;
if (forceGC) {
GC.Collect();
}
} catch (AtomicFakeException) {
}
// Read-modify-write non-inflated objects
Console.WriteLine("\n\nRead-modify-write in an atomic block");
try {
lo1.x ++;
lo2.x ++;
if (forceGC) {
GC.Collect();
}
} catch (AtomicFakeException) {
}
// Read from objects whose multi-use-word is in use
Console.WriteLine("\n\nRead from object with multi-use-word in use");
try {
v = lo3.x;
v = lo4.x;
if (forceGC) {
GC.Collect();
}
} catch (AtomicFakeException) {
}
// Read-modify-write objects whose multi-use-word is in use
Console.WriteLine("\n\nRead-modify-write from object with multi-use-word in use");
try {
lo3.x ++;
lo4.x ++;
if (forceGC) {
GC.Collect();
}
} catch (AtomicFakeException) {
}
// Trigger inflation within a read-modify-write atomic block
Console.WriteLine("\n\nTrigger inflation in a read-modify-write atomic block");
try {
lo1.x ++;
h_in1 = lo1.GetHashCode();
if (forceGC) {
GC.Collect();
}
} catch (AtomicFakeException) {
}
// Trigger inflation within a read-only atomic block
Console.WriteLine("\n\nTrigger inflation in a read-only atomic block");
try {
v = lo2.x;
h_in2 = lo2.GetHashCode();
if (forceGC) {
GC.Collect();
}
} catch (AtomicFakeException) {
}
// Read an inflated object
Console.WriteLine("\n\nReading from an inflated object in an atomic block");
try {
v = lo1.x;
v = lo2.x;
if (forceGC) {
GC.Collect();
}
} catch (AtomicFakeException) {
}
// Read-modify-write an inflated object
Console.WriteLine("\n\nRead-modify-write an inflated object in an atomic block");
try {
v = lo1.x++;
v = lo2.x++;
if (forceGC) {
GC.Collect();
}
} catch (AtomicFakeException) {
}
// Read-modify-write an inflated object
Console.WriteLine("\n\nRead-modify-write an inflated object in an atomic block");
try {
v = lo1.x++;
v = lo2.x++;
if (forceGC) {
GC.Collect();
}
} catch (AtomicFakeException) {
}
h = lo1.GetHashCode();
Console.WriteLine("\n\nDiff on lo1.GetHashCode() = " + (h-h_in1));
h = lo2.GetHashCode();
Console.WriteLine("Diff on lo2.GetHashCode() = " + (h-h_in2));
}
}
}
}