You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
38 lines
912 B
38 lines
912 B
5 years ago
|
#if FAT
|
||
|
|
||
|
using System;
|
||
|
using System.Threading;
|
||
|
|
||
|
namespace LinqInternal.Threading.Needles
|
||
|
{
|
||
|
internal sealed class LockableContext
|
||
|
{
|
||
|
internal readonly LockContext<Thread> Context;
|
||
|
private readonly StructNeedle<TrackingThreadLocal<LockableSlot>> _slots;
|
||
|
|
||
|
public LockableContext(int capacity)
|
||
|
{
|
||
|
Context = new LockContext<Thread>(capacity);
|
||
|
_slots.Value = new TrackingThreadLocal<LockableSlot>(() => null);
|
||
|
}
|
||
|
|
||
|
internal LockableSlot Slot
|
||
|
{
|
||
|
get { return _slots.Value.Value; }
|
||
|
|
||
|
set { _slots.Value.Value = value; }
|
||
|
}
|
||
|
|
||
|
public IDisposable Enter()
|
||
|
{
|
||
|
return new LockableSlot(this);
|
||
|
}
|
||
|
|
||
|
internal bool TryGetSlot(out LockableSlot slot)
|
||
|
{
|
||
|
return _slots.Value.TryGetValue(Thread.CurrentThread, out slot) && slot != null;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|