Exemple #1
0
 /// <summary>
 /// Disposes the lock.
 /// </summary>
 /// <param name="lockInfo">The lock information.</param>
 private static void DisposeLock(ResourceLockInfo lockInfo)
 {
     using (_resourcesLock.WriterLock())
     {
         lockInfo.DecrementReferenceCount();
         if (lockInfo.CanDispose())
         {
             _resources.Remove(lockInfo.NamedKey);
             lockInfo.Dispose();
         }
     }
 }
 /// <summary>
 /// Disposes the lock.
 /// </summary>
 /// <param name="lockInfo">The lock information.</param>
 private static void DisposeLock(ResourceLockInfo lockInfo)
 {
     _resourcesLock.EnterWriteLock();
     try
     {
         lockInfo.DecrementReferenceCount();
         if (lockInfo.CanDispose())
         {
             _resources.Remove(lockInfo.NamedKey);
             lockInfo.Dispose();
         }
     }
     finally
     {
         _resourcesLock.ExitWriteLock();
     }
 }
        /// <summary>
        /// Gets the lock information.
        /// </summary>
        /// <param name="nameKey">The name key.</param>
        /// <returns></returns>
        private static ResourceLockInfo GetLockInfo(string nameKey)
        {
            _resourcesLock.EnterReadLock();
            try
            {
                if (_resources.ContainsKey(nameKey))
                {
                    var lockInfo = _resources[nameKey];
                    lockInfo.IncrementReferenceCount();

                    return(lockInfo);
                }
            }
            finally
            {
                _resourcesLock.ExitReadLock();
            }

            _resourcesLock.EnterWriteLock();
            try
            {
                ResourceLockInfo lockInfo;

                if (_resources.ContainsKey(nameKey))
                {
                    lockInfo = _resources[nameKey];
                    lockInfo.IncrementReferenceCount();

                    return(lockInfo);
                }

                lockInfo = new ResourceLockInfo(nameKey)
                {
                    Lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion)
                };
                lockInfo.IncrementReferenceCount();

                _resources.Add(nameKey, lockInfo);

                return(lockInfo);
            }
            finally
            {
                _resourcesLock.ExitWriteLock();
            }
        }
Exemple #4
0
        /// <summary>
        /// Gets the lock information.
        /// </summary>
        /// <param name="nameKey">The name key.</param>
        /// <returns></returns>
        private static ResourceLockInfo GetLockInfo(string nameKey)
        {
            using (_resourcesLock.ReaderLock())
            {
                if (_resources.ContainsKey(nameKey))
                {
                    var lockInfo = _resources[nameKey];
                    lockInfo.IncrementReferenceCount();

                    return(lockInfo);
                }
            }

            using (_resourcesLock.WriterLock())
            {
                ResourceLockInfo lockInfo;

                if (_resources.ContainsKey(nameKey))
                {
                    lockInfo = _resources[nameKey];
                    lockInfo.IncrementReferenceCount();

                    return(lockInfo);
                }

                lockInfo = new ResourceLockInfo(nameKey)
                {
                    Lock = new AsyncReaderWriterLock()
                };
                lockInfo.IncrementReferenceCount();

                _resources.Add(nameKey, lockInfo);

                return(lockInfo);
            }
        }