Пример #1
0
 internal V Get <V>(UserDataSlot <V> slot, V defaultValue)
 {
     using (synchronizer.AcquireReadLock())
     {
         return(slot.GetUserData(this, defaultValue));
     }
 }
Пример #2
0
 internal bool Get <V>(UserDataSlot <V> slot, out V userData)
 {
     using (synchronizer.AcquireReadLock())
     {
         return(slot.GetUserData(this, out userData));
     }
 }
Пример #3
0
            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);
                }
            }
Пример #4
0
 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));
     }
 }