148 lines
4.7 KiB
C#
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));
|
|
}
|
|
}
|
|
}
|
|
}
|