コード例 #1
0
 private bool ReadInProgress()
 {
     for (int i = 0; i < _readIndicator.Length; ++i)
     {
         if (RUnordered.Read(ref _readIndicator[i]) != 0)
         {
             return(true);
         }
     }
     return(false);
 }
コード例 #2
0
 internal void Enter()
 {
     if (RUnordered.Read(ref _isHeld) == 1)
     {
         int currentThreadId = Environment.CurrentManagedThreadId;
         if (RUnordered.Read(ref _holdingThreadId) == currentThreadId)
         {
             return;
         }
     }
     EnterSlow();
 }
コード例 #3
0
 internal void EnterWriteLock()
 {
     RMonitor.Enter(_lockObj);
     RUnordered.Write(ref _writerActive, 1);
     RInterlocked.MemoryBarrierProcessWide();
     while (ReadInProgress())
     {
         RE.Yield();
     }
     _snoop.BeginWrite();
     return;
 }
コード例 #4
0
 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;
 }
コード例 #5
0
            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();
            }
コード例 #6
0
            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);
            }
コード例 #7
0
            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());
            }
コード例 #8
0
 public void Exit()
 {
     RUnordered.Write(ref _isHeld, 0);
 }
コード例 #9
0
 public void Exit()
 {
     RUnordered.Write(ref Taken, 0);
 }
コード例 #10
0
 internal LockCookie(int threadId)
 {
     ThreadId = threadId;
     RUnordered.Write(ref Taken, 1);
 }
コード例 #11
0
 internal void ExitReadLock()
 {
     RUnordered.Write(ref _readIndicator[_thisReaderIndex.Value], 0);
     _snoop.EndRead();
 }
コード例 #12
0
 internal void ExitWriteLock()
 {
     RUnordered.Write(ref _writerActive, 0);
     _snoop.EndWrite();
     RMonitor.Exit(_lockObj);
 }
コード例 #13
0
ファイル: COWList.cs プロジェクト: nicknash/RelaSharp
 public int this[int idx] => RUnordered.Read(ref _data)[idx];