343 lines
10 KiB
C#
343 lines
10 KiB
C#
|
//
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
|
||
|
/*******************************************************************/
|
||
|
/* WARNING */
|
||
|
/* This file should be identical in the Bartok and Singularity */
|
||
|
/* depots. Master copy resides in Bartok Depot. Changes should be */
|
||
|
/* made to Bartok Depot and propagated to Singularity Depot. */
|
||
|
/*******************************************************************/
|
||
|
|
||
|
namespace System.GCs
|
||
|
{
|
||
|
using Microsoft.Bartok.Runtime;
|
||
|
using System.Runtime.CompilerServices;
|
||
|
using System.Threading;
|
||
|
|
||
|
internal abstract unsafe class RefWriteBarrier: Barrier
|
||
|
{
|
||
|
[NoBarriers]
|
||
|
protected override int AtomicSwapImpl(ref int location,
|
||
|
int value,
|
||
|
int mask)
|
||
|
{
|
||
|
return Interlocked.Exchange(ref location, value);
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
protected override UIntPtr AtomicSwapImpl(ref UIntPtr location,
|
||
|
UIntPtr value,
|
||
|
int mask)
|
||
|
{
|
||
|
return Interlocked.Exchange(ref location, value);
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
protected override int AtomicCompareAndSwapImpl(ref int location,
|
||
|
int newValue,
|
||
|
int comparand,
|
||
|
int mask)
|
||
|
{
|
||
|
return Interlocked.CompareExchange(ref location,
|
||
|
newValue, comparand);
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
protected override long AtomicCompareAndSwapImpl(ref long location,
|
||
|
long newValue,
|
||
|
long comparand,
|
||
|
int mask)
|
||
|
{
|
||
|
return Interlocked.CompareExchange(ref location,
|
||
|
newValue, comparand);
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
protected override
|
||
|
UIntPtr AtomicCompareAndSwapImpl(ref UIntPtr location,
|
||
|
UIntPtr newValue,
|
||
|
UIntPtr comparand,
|
||
|
int mask)
|
||
|
{
|
||
|
return Interlocked.CompareExchange(ref location,
|
||
|
newValue, comparand);
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
[NoBarriers]
|
||
|
protected override Object WeakRefReadImpl(UIntPtr addr, int mask)
|
||
|
{
|
||
|
return Magic.fromAddress(addr);
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
[NoBarriers]
|
||
|
protected override UIntPtr WeakRefWriteImpl(Object obj,
|
||
|
int mask)
|
||
|
{
|
||
|
return Magic.addressOf(obj);
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
[NoBarriers]
|
||
|
protected override bool EqImpl(Object a,Object b, int mask)
|
||
|
{
|
||
|
return a==b;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
[NoBarriers]
|
||
|
protected override bool AllowFastPathImpl() {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
protected override void WriteImpl(float *location,
|
||
|
float value,
|
||
|
int mask)
|
||
|
{
|
||
|
*location = value;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
protected override void WriteImpl(double *location,
|
||
|
double value,
|
||
|
int mask)
|
||
|
{
|
||
|
*location = value;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
protected override void WriteImpl(byte *location,
|
||
|
byte value,
|
||
|
int mask)
|
||
|
{
|
||
|
*location = value;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
protected override void WriteImpl(ushort *location,
|
||
|
ushort value,
|
||
|
int mask)
|
||
|
{
|
||
|
*location = value;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
protected override void WriteImpl(uint *location,
|
||
|
uint value,
|
||
|
int mask)
|
||
|
{
|
||
|
*location = value;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
protected override void WriteImpl(ulong *location,
|
||
|
ulong value,
|
||
|
int mask)
|
||
|
{
|
||
|
*location = value;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
protected override void WriteImpl(UIntPtr *location,
|
||
|
UIntPtr value,
|
||
|
int mask)
|
||
|
{
|
||
|
*location = value;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
protected override Object ReadObjImpl(UIntPtr *location,
|
||
|
int mask)
|
||
|
{
|
||
|
return Magic.fromAddress(*location);
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
protected override float ReadImpl(float *location,
|
||
|
int mask)
|
||
|
{
|
||
|
return *location;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
protected override double ReadImpl(double *location,
|
||
|
int mask)
|
||
|
{
|
||
|
return *location;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
protected override byte ReadImpl(byte *location,
|
||
|
int mask)
|
||
|
{
|
||
|
return *location;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
protected override ushort ReadImpl(ushort *location,
|
||
|
int mask)
|
||
|
{
|
||
|
return *location;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
protected override uint ReadImpl(uint *location,
|
||
|
int mask)
|
||
|
{
|
||
|
return *location;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
protected override ulong ReadImpl(ulong *location,
|
||
|
int mask)
|
||
|
{
|
||
|
return *location;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
protected override UIntPtr ReadImpl(UIntPtr *location,
|
||
|
int mask)
|
||
|
{
|
||
|
return *location;
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
[Inline]
|
||
|
protected override void WriteImplByRef(ref float location,
|
||
|
float value,
|
||
|
int mask)
|
||
|
{
|
||
|
location = value;
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
[Inline]
|
||
|
protected override void WriteImplByRef(ref double location,
|
||
|
double value,
|
||
|
int mask)
|
||
|
{
|
||
|
location = value;
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
[Inline]
|
||
|
protected override void WriteImplByRef(ref byte location,
|
||
|
byte value,
|
||
|
int mask)
|
||
|
{
|
||
|
location = value;
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
[Inline]
|
||
|
protected override void WriteImplByRef(ref ushort location,
|
||
|
ushort value,
|
||
|
int mask)
|
||
|
{
|
||
|
location = value;
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
[Inline]
|
||
|
protected override void WriteImplByRef(ref uint location,
|
||
|
uint value,
|
||
|
int mask)
|
||
|
{
|
||
|
location = value;
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
[Inline]
|
||
|
protected override void WriteImplByRef(ref ulong location,
|
||
|
ulong value,
|
||
|
int mask)
|
||
|
{
|
||
|
location = value;
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
[Inline]
|
||
|
protected override void WriteImplByRef(ref UIntPtr location,
|
||
|
UIntPtr value,
|
||
|
int mask)
|
||
|
{
|
||
|
location = value;
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
[Inline]
|
||
|
protected override Object ReadImplByRef(ref Object location,
|
||
|
int mask)
|
||
|
{
|
||
|
return location;
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
[Inline]
|
||
|
protected override float ReadImplByRef(ref float location,
|
||
|
int mask)
|
||
|
{
|
||
|
return location;
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
[Inline]
|
||
|
protected override double ReadImplByRef(ref double location,
|
||
|
int mask)
|
||
|
{
|
||
|
return location;
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
[Inline]
|
||
|
protected override byte ReadImplByRef(ref byte location,
|
||
|
int mask)
|
||
|
{
|
||
|
return location;
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
[Inline]
|
||
|
protected override ushort ReadImplByRef(ref ushort location,
|
||
|
int mask)
|
||
|
{
|
||
|
return location;
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
[Inline]
|
||
|
protected override uint ReadImplByRef(ref uint location,
|
||
|
int mask)
|
||
|
{
|
||
|
return location;
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
[Inline]
|
||
|
protected override ulong ReadImplByRef(ref ulong location,
|
||
|
int mask)
|
||
|
{
|
||
|
return location;
|
||
|
}
|
||
|
|
||
|
[NoBarriers]
|
||
|
[Inline]
|
||
|
protected override UIntPtr ReadImplByRef(ref UIntPtr location,
|
||
|
int mask)
|
||
|
{
|
||
|
return location;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
protected override Object LoadStaticFieldImpl(ref Object staticField,
|
||
|
int mask)
|
||
|
{
|
||
|
return this.ReadImplByRef(ref staticField, mask);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|