private bool ReadInProgress() { for (int i = 0; i < _readIndicator.Length; ++i) { if (RUnordered.Read(ref _readIndicator[i]) != 0) { return(true); } } return(false); }
internal void Enter() { if (RUnordered.Read(ref _isHeld) == 1) { int currentThreadId = Environment.CurrentManagedThreadId; if (RUnordered.Read(ref _holdingThreadId) == currentThreadId) { return; } } EnterSlow(); }
internal void EnterWriteLock() { RMonitor.Enter(_lockObj); RUnordered.Write(ref _writerActive, 1); RInterlocked.MemoryBarrierProcessWide(); while (ReadInProgress()) { RE.Yield(); } _snoop.BeginWrite(); return; }
private void EnterSlow() { RMonitor.Enter(_lockObj); RUnordered.Write(ref _holdingThreadId, Environment.CurrentManagedThreadId); RInterlocked.MemoryBarrierProcessWide(); while (RUnordered.Read(ref _isHeld) == 1) { RE.Yield(); } RUnordered.Write(ref _isHeld, 1); RMonitor.Exit(_lockObj); return; }
internal void EnterReadLock() { var idx = GetReaderIndex(); RUnordered.Write(ref _readIndicator[idx], 1); if (RUnordered.Read(ref _writerActive) == 1) { RUnordered.Write(ref _readIndicator[idx], 0); RMonitor.Enter(_lockObj); RUnordered.Write(ref _readIndicator[idx], 1); RMonitor.Exit(_lockObj); } _snoop.BeginRead(); }
private LockCookie EnterSlow() { RMonitor.Enter(_lockObj); var oldEntry = RUnordered.Read(ref _current); RUnordered.Write(ref _current, new LockCookie(Environment.CurrentManagedThreadId)); RInterlocked.MemoryBarrierProcessWide(); while (oldEntry != null && RUnordered.Read(ref oldEntry.Taken) == 1) { RE.Yield(); } var current = RUnordered.Read(ref _current); RUnordered.Write(ref current.Taken, 1); RMonitor.Exit(_lockObj); return(current); }
internal LockCookie Enter() { int currentThreadId = Environment.CurrentManagedThreadId; LockCookie entry = RUnordered.Read(ref _current); if (entry?.ThreadId == currentThreadId) { RUnordered.Write(ref entry.Taken, 1); if (RVolatile.Read(ref _current) == entry) { return(entry); } RUnordered.Write(ref entry.Taken, 0); } return(EnterSlow()); }
public void Exit() { RUnordered.Write(ref _isHeld, 0); }
public void Exit() { RUnordered.Write(ref Taken, 0); }
internal LockCookie(int threadId) { ThreadId = threadId; RUnordered.Write(ref Taken, 1); }
internal void ExitReadLock() { RUnordered.Write(ref _readIndicator[_thisReaderIndex.Value], 0); _snoop.EndRead(); }
internal void ExitWriteLock() { RUnordered.Write(ref _writerActive, 0); _snoop.EndWrite(); RMonitor.Exit(_lockObj); }
public int this[int idx] => RUnordered.Read(ref _data)[idx];