38 return (uint)(
_data >> (int)shift);
43 _data = (
_data & ~(4294967295uL << (int)shift)) | ((ulong)
value << (int)shift);
48 return (ushort)(
_data >> (int)shift);
53 return (
byte)(
_data >> (int)shift);
68 _data += 4294967296uL;
73 _data -= 4294967296uL;
83 _data += 281474976710656uL;
88 _data -= 281474976710656uL;
103 _data -= 72057594037927936uL;
113 return lhs._data == rhs.
_data;
116 public override bool Equals([NotNullWhen(
true)]
object obj)
120 return _data == counts._data;
153 _separated._counts.SignalCount = (uint)initialSignalCount;
157 Create(maximumSignalCount);
160 public bool Wait(
int timeoutMs,
bool spinWait)
172 else if (timeoutMs != 0)
184 if (counts2 == counts)
203 int num2 = ((processorCount <= 1) ? 10 : 0);
211 Counts newCounts2 = counts;
215 if (counts3 == counts)
225 Counts newCounts3 = counts;
236 if (counts4 == counts)
255 Counts newCounts = counts;
260 if (num > releaseCount)
267 if (counts2 == counts)
293 Counts newCounts = counts;
304 if (counts2 == counts)
315 private void Create(
int maximumSignalCount)
322 ex.HResult = lastPInvokeError;
345 for (
int i = 0; i <
count; i++)
351 ex.HResult = lastPInvokeError;
static bool PostQueuedCompletionStatus(IntPtr CompletionPort, int dwNumberOfBytesTransferred, UIntPtr CompletionKey, IntPtr lpOverlapped)
static bool CloseHandle(IntPtr handle)
static bool GetQueuedCompletionStatus(IntPtr CompletionPort, out int lpNumberOfBytes, out UIntPtr CompletionKey, out IntPtr lpOverlapped, int dwMilliseconds)
static IntPtr CreateIoCompletionPort(IntPtr FileHandle, IntPtr ExistingCompletionPort, UIntPtr CompletionKey, int NumberOfConcurrentThreads)
static int ProcessorCount
static void SuppressFinalize(object obj)
static byte Min(byte val1, byte val2)
static int GetLastPInvokeError()
static int CompareExchange(ref int location1, int value, int comparand)
static int Add(ref int location1, int value)
bool WaitForSignal(int timeoutMs)
void ReleaseCore(int count)
readonly int _maximumSignalCount
void Create(int maximumSignalCount)
LowLevelLifoSemaphore(int initialSignalCount, int maximumSignalCount, int spinCount, Action onWait)
bool WaitCore(int timeoutMs)
bool Wait(int timeoutMs, bool spinWait)
void Release(int releaseCount)
CacheLineSeparatedCounts _separated
static readonly IntPtr Zero
readonly PaddingFor32 _pad2
readonly PaddingFor32 _pad1
void SetUInt32Value(uint value, byte shift)
override int GetHashCode()
override bool Equals([NotNullWhen(true)] object obj)
void DecrementSignalCount()
void AddUpToMaxCountOfWaitersSignaledToWake(uint value)
void DecrementWaiterCount()
ushort GetUInt16Value(byte shift)
uint GetUInt32Value(byte shift)
void IncrementWaiterCount()
void DecrementCountOfWaitersSignaledToWake()
void InterlockedDecrementWaiterCount()
Counts InterlockedCompareExchange(Counts newCounts, Counts oldCounts)
void IncrementSpinnerCount()
byte CountOfWaitersSignaledToWake
static bool operator==(Counts lhs, Counts rhs)
byte GetByteValue(byte shift)
void DecrementSpinnerCount()
void AddSignalCount(uint value)
static void Wait(int spinIndex, int sleep0Threshold, int processorCount)
static readonly UIntPtr Zero