internal V Get <V>(UserDataSlot <V> slot, V defaultValue) { using (synchronizer.AcquireReadLock()) { return(slot.GetUserData(this, defaultValue)); } }
internal bool Get <V>(UserDataSlot <V> slot, out V userData) { using (synchronizer.AcquireReadLock()) { return(slot.GetUserData(this, out userData)); } }
internal V GetOrSet <V, S>(UserDataSlot <V> slot, ref S valueFactory) where S : struct, ISupplier <V> { V userData; //fast path - read user data if it is already exists //do not use UpgradeableReadLock due to performance reasons using (synchronizer.AcquireReadLock()) { if (slot.GetUserData(this, out userData)) { return(userData); } } //non-fast path, no user data presented using (synchronizer.AcquireWriteLock()) { if (!slot.GetUserData(this, out userData)) { slot.SetUserData(this, userData = valueFactory.Supply()); } return(userData); } }
internal bool Remove <V>(UserDataSlot <V> slot, out V userData) { //fast path if user data doesn't exist using (synchronizer.AcquireReadLock()) { if (!slot.Contains(this)) { userData = default; return(false); } } //non-fast path, user data exists, so remove it using (synchronizer.AcquireWriteLock()) { userData = slot.GetUserData(this, default); return(slot.RemoveUserData(this)); } }