Made initial implementation of the thread scheduler, refactor Svc to avoid passing many arguments

This commit is contained in:
gdkchan 2018-02-13 23:43:08 -03:00
parent 598d1fd3ae
commit f68696dc4a
19 changed files with 740 additions and 252 deletions

View file

@ -66,10 +66,10 @@ namespace ChocolArm64.Memory
public void SetExclusive(ARegisters Registers, long Position)
{
Position &= ~ErgMask;
lock (Monitors)
{
Position &= ~ErgMask;
if (Monitors.TryGetValue(Registers.ThreadId, out ExMonitor Monitor))
{
ExAddrs.Remove(Monitor.Position);
@ -88,10 +88,10 @@ namespace ChocolArm64.Memory
public bool TestExclusive(ARegisters Registers, long Position)
{
Position &= ~ErgMask;
lock (Monitors)
{
Position &= ~ErgMask;
if (!Monitors.TryGetValue(Registers.ThreadId, out ExMonitor Monitor))
{
return false;
@ -113,6 +113,26 @@ namespace ChocolArm64.Memory
}
}
public bool AcquireAddress(long Position)
{
Position &= ~ErgMask;
lock (Monitors)
{
return ExAddrs.Add(Position);
}
}
public void ReleaseAddress(long Position)
{
Position &= ~ErgMask;
lock (Monitors)
{
ExAddrs.Remove(Position);
}
}
public sbyte ReadSByte(long Position) => (sbyte)ReadByte (Position);
public short ReadInt16(long Position) => (short)ReadUInt16(Position);
public int ReadInt32(long Position) => (int)ReadUInt32(Position);