Beispiel #1
0
 /// <summary>
 /// Creates cache enabled Slim lock with policy.
 /// </summary>
 /// <param name="policy"><see cref="LockRecursionPolicy"/> that specifies whether a lock can be entered multiple times by the same thread.</param>
 public CacheEnabledSlimLock(LockRecursionPolicy policy)
     : base(policy)
 {
     this.cachedLRB  = new LockedReadBlock(this.rwLock);
     this.cachedLWB  = new LockedWriteBlock(this.rwLock);
     this.cachedLURB = new LockedUpgradeableReadBlock(this.rwLock);
 }
Beispiel #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="recursionPolicy">
        /// This parameter is forwarded to the constructor of the backing
        /// <see cref="ReaderWriterLockSlim"/> object
        /// </param>
        /// <param name="disableDispatcherProcessingWhenNoRecursion">
        /// Specifies whether Dispatcher processing should be disabled when
        /// <paramref name="recursionPolicy"/> is <see cref="LockRecursionPolicy.NoRecursion"/>.
        /// It is preferable to disable Dispatcher processing to prevent reentrancy problems.
        /// If Dispatcher processing is disabled, the critical action that is performed while
        /// the lock is held cannot in turn depend on dispatcher processing - for e.g., any
        /// actions involving UI updates would throw an exception. The default value for this
        /// parameter is true -i.e., we disable Dispatcher processing by default when
        /// <see cref="LockRecursionPolicy.NoRecursion"/> is specified.
        ///
        /// This parameter is ignored when <see cref="LockRecursionPolicy.SupportsRecursion"/>
        /// is specified.
        /// </param>
        internal ReaderWriterLockSlimWrapper(
            LockRecursionPolicy recursionPolicy             = LockRecursionPolicy.NoRecursion,
            bool disableDispatcherProcessingWhenNoRecursion = true)
        {
            _lockRecursionPolicy = recursionPolicy;
            _disableDispatcherProcessingWhenNoRecursion = disableDispatcherProcessingWhenNoRecursion;

            _rwLock = new ReaderWriterLockSlim(_lockRecursionPolicy);

            _disposed = false;

            // Suppress finalization of this object.
            //
            // This ensures that the lock is usable within finalizers
            // of other objects that have an instance of this type and
            // use it for locking there.
            //
            // It would be the responsibility of caller to explicitly
            // dispose this object. If an explicit call to Dispose() fails,
            // say because the lock is held at that time by another thread,
            // we will re-enable finalization and try to cleanup again when
            // Dispose is called from within the finalizer.
            //
            // This can create the potential for this object to be
            // never finalized. This can happen if the caller forgets
            // to call Dispose() explicitly. In that case, the backing
            // ReaderWriterLockSlim object will still get disposed properly
            // when its finalizer runs.

            GC.SuppressFinalize(this);
        }
Beispiel #3
0
        /// <summary>
        /// Creates RockLock.
        /// </summary>
        /// <param name="recursionPolicy">Recursion policy.</param>
        public RockLock(LockRecursionPolicy recursionPolicy = LockRecursionPolicy.NoRecursion)
        {
            this.rwLock = new ReaderWriterLockSlim(recursionPolicy);

            this.readLock  = new ReadLock(this.rwLock);
            this.writeLock = new WriteLock(this.rwLock);
        }
 public GuardedReaderWriterLock(LockRecursionPolicy recursionPolicy)
 {
     _lock         = new ReaderWriterLockSlim(recursionPolicy);
     _readGuard    = new AutoGuard(_lock, false);
     _writeGuard   = new AutoGuard(_lock, true);
     _upgradeGuard = new UpgradeGuard(_lock);
 }
 public ReaderWriterLockSlim(LockRecursionPolicy recursionPolicy)
 {
     if (recursionPolicy == LockRecursionPolicy.SupportsRecursion)
     {
         this.fIsReentrant = true;
     }
     this.InitializeThreadCounts();
 }
 public ReaderWriterLockSlim(LockRecursionPolicy recursionPolicy)
 {
     if (recursionPolicy == LockRecursionPolicy.SupportsRecursion)
     {
         _fIsReentrant = true;
     }
     InitializeThreadCounts();
 }
Beispiel #7
0
 public ReaderWriterLockSlim(LockRecursionPolicy recursionPolicy)
 {
     this.recursionPolicy = recursionPolicy;
     if (recursionPolicy != 0)
     {
         throw new NotImplementedException("recursionPolicy != NoRecursion not currently implemented");
     }
 }
Beispiel #8
0
        internal SlimLockWrapper(LockRecursionPolicy policy)
        {
#if NET40
            _rwsObject = new ReaderWriterLockSlim(policy);
#else
            _rwsObject = new ReaderWriterLock();
#endif
        }
Beispiel #9
0
        public ReaderWriterLockSlim(LockRecursionPolicy recursionPolicy)
        {
            this.recursionPolicy = recursionPolicy;

            if (recursionPolicy != LockRecursionPolicy.NoRecursion)
            {
                //reader_locks = new Dictionary<int,int> ();
                throw new NotImplementedException("recursionPolicy != NoRecursion not currently implemented");
            }
        }
Beispiel #10
0
        /// <summary>
        /// Initializes a new instance of <see cref="IocContainer"/> with a parent.
        /// </summary>
        /// <param name="parent">The parent container.</param>
        /// <param name="allowRecursiveResolution">
        /// If true, recursive calls to Resolve or GetInstance overloads will be allowed.
        /// </param>
        /// <remarks>
        /// If a service cannot be found in this container, the parent is checked.
        ///
        /// Recursive activations may cause a <see cref="StackOverflowException"/> if it
        /// triggers resolution of co-dependent types.
        ///
        /// Care must be taken when enabling this feature. Consider the code:
        /// <code>
        /// class ExampleA : IExampleA
        /// {
        ///     private IExampleB b;
        ///
        ///     public ExampleA(IServiceLocator ioc)
        ///     {
        ///         b = ioc.GetInstance&lt;IExampleB&gt;();
        ///     }
        /// }
        ///
        /// class ExampleB : IExampleB
        /// {
        ///     private IExampleA a;
        ///
        ///     public ExampleB(IServiceLocator ioc)
        ///     {
        ///         a = ioc.GetInstance&lt;IExampleA&gt;();
        ///     }
        /// }
        ///
        /// void Main()
        /// {
        ///     var ioc = new IocContainer(<paramref name="allowRecursiveResolution"/>: false);
        ///     ioc.Bind&lt;IServiceLocator&gt;(() =&gt; ioc);
        ///     ioc.Bind&lt;IExampleA, ExampleA&gt;();
        ///     ioc.Bind&lt;IExampleB, ExampleB&gt;();
        ///
        ///     IExampleA a = ioc.Resolve&lt;IExampleA&gt;();
        /// }
        /// </code>
        ///
        /// If <paramref name="allowRecursiveResolution"/> were true, an uncatchable
        /// <see cref="StackOverflowException"/> would be raised because both ExampleA and
        /// ExampleB try to resolve each other from their constructors.
        /// </remarks>
        public IocContainer(IServiceLocator parent, bool allowRecursiveResolution)
        {
            _parentContainer = parent;

            LockRecursionPolicy recursionPolicy = allowRecursiveResolution
                ? LockRecursionPolicy.SupportsRecursion
                : LockRecursionPolicy.NoRecursion;

            _lock = new ReaderWriterLockSlim(recursionPolicy);
        }
Beispiel #11
0
 public ReaderWriterLockSlim(LockRecursionPolicy recursionPolicy)
 {
     if (recursionPolicy == LockRecursionPolicy.SupportsRecursion)
     {
         _fIsReentrant = true;
     }
     InitializeThreadCounts();
     _fNoWaiters = true;
     _lockID     = Interlocked.Increment(ref s_nextLockID);
 }
 public ReaderWriterLockSlim(LockRecursionPolicy recursionPolicy)
 {
     RecursionPolicy = recursionPolicy;
     _noRecursion    = recursionPolicy == LockRecursionPolicy.NoRecursion;
     // ---
     _id              = Interlocked.Increment(ref _idPool);
     _fastStateCache  = new ThreadLockState[64];
     _upgradableTaken = new AtomicBoolean();
     _upgradableEvent = new ManualResetEventSlim(true);
     _writerDoneEvent = new ManualResetEventSlim(true);
     _readerDoneEvent = new ManualResetEventSlim(true);
 }
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="recursionPolicy">递归策略 默认是不支持递归</param>
        public MyReaderWriterLockSlim(MyLockRecursionPolicy recursionPolicy)
        {
            LockRecursionPolicy policy = LockRecursionPolicy.NoRecursion;

            switch (recursionPolicy)
            {
            case MyLockRecursionPolicy.NoRecursion:
                policy = LockRecursionPolicy.NoRecursion;
                break;

            case MyLockRecursionPolicy.SupportsRecursion:
                policy = LockRecursionPolicy.SupportsRecursion;
                break;

            default:
                break;
            }
            locker = new ReaderWriterLockSlim(policy);
        }
        public static void InvalidExits(LockRecursionPolicy policy)
        {
            using (ReaderWriterLockSlim rwls = new ReaderWriterLockSlim(policy))
            {
                Assert.Throws <SynchronizationLockException>(() => rwls.ExitReadLock());
                Assert.Throws <SynchronizationLockException>(() => rwls.ExitUpgradeableReadLock());
                Assert.Throws <SynchronizationLockException>(() => rwls.ExitWriteLock());

                rwls.EnterReadLock();
                Assert.Throws <SynchronizationLockException>(() => rwls.ExitUpgradeableReadLock());
                Assert.Throws <SynchronizationLockException>(() => rwls.ExitWriteLock());
                rwls.ExitReadLock();

                rwls.EnterUpgradeableReadLock();
                Assert.Throws <SynchronizationLockException>(() => rwls.ExitReadLock());
                Assert.Throws <SynchronizationLockException>(() => rwls.ExitWriteLock());
                rwls.ExitUpgradeableReadLock();

                rwls.EnterWriteLock();
                Assert.Throws <SynchronizationLockException>(() => rwls.ExitReadLock());
                Assert.Throws <SynchronizationLockException>(() => rwls.ExitUpgradeableReadLock());
                rwls.ExitWriteLock();

                using (Barrier barrier = new Barrier(2))
                {
                    Task t = Task.Factory.StartNew(() =>
                    {
                        rwls.EnterWriteLock();
                        barrier.SignalAndWait();
                        barrier.SignalAndWait();
                        rwls.ExitWriteLock();
                    }, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);

                    barrier.SignalAndWait();
                    Assert.Throws <SynchronizationLockException>(() => rwls.ExitWriteLock());
                    barrier.SignalAndWait();

                    t.GetAwaiter().GetResult();
                }
            }
        }
Beispiel #15
0
    /// <summary>
    /// Initializes a new instance of the ConcurrentList class.
    /// </summary>
    /// <param name="recursionPolicy">One of the enumeration values that specifies the lock recursion policy.</param>
    /// <param name="collection">The collection of elements used to initialize the thread-safe collection.</param>
    /// <param name="useSource">true if set the collection as source directly instead of copying; otherwise, false.</param>
    internal SynchronizedList(LockRecursionPolicy recursionPolicy, IEnumerable <T> collection = null, bool useSource = false)
    {
        slim = new ReaderWriterLockSlim(recursionPolicy);
        if (collection is null)
        {
            list = new List <T>();
            return;
        }

        if (useSource)
        {
            if (collection is List <T> l)
            {
                list = l;
                return;
            }
            else if (collection is SynchronizedList <T> sl)
            {
                list = sl.list;
                return;
            }
        }

        try
        {
            list = new List <T>(collection);
        }
        catch (NullReferenceException)
        {
            list = new List <T>(collection);
        }
        catch (InvalidOperationException)
        {
            list = new List <T>(collection);
        }
    }
Beispiel #16
0
 public ReaderWriterLockedObject(T value, LockRecursionPolicy policy)
 {
     _value       = value;
     _lockContext = new ReaderWriterLockContext(policy);
 }
 public PortableReaderWriterLock(LockRecursionPolicy lockRecursionPolicy)
 {
     // Lock
     _readerWriterLock = new ReaderWriterLockSlim(lockRecursionPolicy);
 }
 /// <summary>
 /// Creates a new <see cref="EnhancedReaderWriterLock"/> using a <seealso cref="LockRecursionPolicy"/>.
 /// </summary>
 /// <param name="policy">the policy</param>
 public EnhancedReaderWriterLock(LockRecursionPolicy policy)
 {
     _rwLock = new ReaderWriterLockSlim(policy);
 }
Beispiel #19
0
 public KeyLockManager(LockRecursionPolicy policy)
 {
     _policy       = policy;
     _keyLockTable = new Dictionary <TKey, SlimLockWrapper>();
 }
Beispiel #20
0
 /// <summary>
 /// 提供锁定递归策略,初始化一个 <see cref="System.LockSlim"/> 类的新实例。
 /// </summary>
 /// <param name="recursionPolicy">锁定递归策略。</param>
 public LockSlim(LockRecursionPolicy recursionPolicy)
 {
     _Slim = new ReaderWriterLockSlim(recursionPolicy);
 }
 public ReaderWriterLockSlimOf(LockRecursionPolicy recursionPolicy = LockRecursionPolicy.NoRecursion)
 {
     @lock = new ReaderWriterLockSlim(recursionPolicy);
 }
Beispiel #22
0
 public ReadWriteLock(LockRecursionPolicy recursionPolicy = LockRecursionPolicy.NoRecursion)
     : base(recursionPolicy)
 {
     _writeGuard = new WriteScopeGuard(this);
     _readGuard = new ReadScopeGuard(this);
 }
 // The special constructor is used to deserialize values.
 public ReaderWriterLockStrategy(SerializationInfo info, StreamingContext context)
 {
     _lockRecursionPolicy = (LockRecursionPolicy)info.GetValue("_lockRecursionPolicy", typeof(LockRecursionPolicy));
     _lock = new ReaderWriterLockSlim(_lockRecursionPolicy);
 }
		public Lock(bool isThreadSafe, LockRecursionPolicy recursionPolicy)
		{
			IsThreadSafe = isThreadSafe;
			if (isThreadSafe)
				_lock = new ReaderWriterLockSlim(recursionPolicy);
		}
 /// <summary>
 /// Constructs an instance on the ReaderWriterSlimResourceLock with the desired recursion policy.
 /// </summary>
 public ReaderWriterSlimResourceLock(LockRecursionPolicy recursionPolicy)
    : base(ResourceLockOptions.AcquiringThreadMustRelease |
    ((recursionPolicy == LockRecursionPolicy.SupportsRecursion) ? ResourceLockOptions.SupportsRecursion : 0)) {
    m_lock = new ReaderWriterLockSlim(recursionPolicy);
 }
 public LockEcritureEtLectureFake(
     LockRecursionPolicy recursionStatut)
 {
 }
Beispiel #27
0
 /// <summary>
 /// 提供锁定递归策略,初始化一个 <see cref="LockSlim"/> 类的新实例。
 /// </summary>
 /// <param name="recursionPolicy">锁定递归策略。</param>
 public LockSlim(LockRecursionPolicy recursionPolicy)
 {
     _Slim = new ReaderWriterLockSlim(recursionPolicy);
 }
 public ReaderWriterLockSlimEx(LockRecursionPolicy recursionPolicy = LockRecursionPolicy.NoRecursion)
     : this(new ReaderWriterLockSlim(recursionPolicy))
 { }
 public ReaderWriterLockSlimEx(string name, LockRecursionPolicy recursionPolicy = LockRecursionPolicy.NoRecursion)
     : this(name, new ReaderWriterLockSlim(recursionPolicy))
 { }
Beispiel #30
0
 public Locker(TObjectLocked objectLocked, LockRecursionPolicy recursionPolicy = LockRecursionPolicy.NoRecursion)
 {
     this.objectLocked = objectLocked;
 }
		public ReaderWriterLockSlim (LockRecursionPolicy recursionPolicy)
		{
			this.recursionPolicy = recursionPolicy;
		}
Beispiel #32
0
 public TwoStageRWLock(LockRecursionPolicy policy = LockRecursionPolicy.NoRecursion)
 {
     _lock = new ReaderWriterLockSlim(policy);
 }
Beispiel #33
0
 public ScopedReaderWriterLock(
     LockRecursionPolicy recursionPolicy)
     : base(recursionPolicy)
 {
 }
Beispiel #34
0
        public ReaderWriterLockSlim(LockRecursionPolicy recursionPolicy)
        {
            this.recursionPolicy = recursionPolicy;

            if (recursionPolicy != LockRecursionPolicy.NoRecursion){
                //reader_locks = new Dictionary<int,int> ();
                throw new NotImplementedException ("recursionPolicy != NoRecursion not currently implemented");
            }
        }
 public static IReaderWriterLock Create(string lockName, int timeOut, LockRecursionPolicy recursionPolicy)
 {
     return new ReaderWriterLock(lockName, timeOut, recursionPolicy);
 }
 public ReaderWriterLockWrap(LockRecursionPolicy lrp)
     : base(lrp)
 {
 }
Beispiel #37
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SyncLock"/> class.
 /// </summary>
 /// <param name="recursionPolicy">The recursion policy.</param>
 public SyncLock(LockRecursionPolicy recursionPolicy) : this(new ReaderWriterLockSlim(recursionPolicy))
 {
 }
        public static void InvalidExits(LockRecursionPolicy policy)
        {
            using (ReaderWriterLockSlim rwls = new ReaderWriterLockSlim(policy))
            {
                Assert.Throws<SynchronizationLockException>(() => rwls.ExitReadLock());
                Assert.Throws<SynchronizationLockException>(() => rwls.ExitUpgradeableReadLock());
                Assert.Throws<SynchronizationLockException>(() => rwls.ExitWriteLock());

                rwls.EnterReadLock();
                Assert.Throws<SynchronizationLockException>(() => rwls.ExitUpgradeableReadLock());
                Assert.Throws<SynchronizationLockException>(() => rwls.ExitWriteLock());
                rwls.ExitReadLock();

                rwls.EnterUpgradeableReadLock();
                Assert.Throws<SynchronizationLockException>(() => rwls.ExitReadLock());
                Assert.Throws<SynchronizationLockException>(() => rwls.ExitWriteLock());
                rwls.ExitUpgradeableReadLock();

                rwls.EnterWriteLock();
                Assert.Throws<SynchronizationLockException>(() => rwls.ExitReadLock());
                Assert.Throws<SynchronizationLockException>(() => rwls.ExitUpgradeableReadLock());
                rwls.ExitWriteLock();

                using (Barrier barrier = new Barrier(2))
                {
                    Task t = Task.Factory.StartNew(() =>
                    {
                        rwls.EnterWriteLock();
                        barrier.SignalAndWait();
                        barrier.SignalAndWait();
                        rwls.ExitWriteLock();
                    }, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);

                    barrier.SignalAndWait();
                    Assert.Throws<SynchronizationLockException>(() => rwls.ExitWriteLock());
                    barrier.SignalAndWait();

                    t.GetAwaiter().GetResult();
                }
            }
        }
 // The special constructor is used to deserialize values.
 public ReaderWriterLockStrategy(SerializationInfo info, StreamingContext context)
 {
     _lockRecursionPolicy = (LockRecursionPolicy)info.GetValue("_lockRecursionPolicy", typeof(LockRecursionPolicy));
     _lock = new ReaderWriterLockSlim(_lockRecursionPolicy);
 }
Beispiel #40
0
 /// <summary>
 /// Creates Slim lock with policy.
 /// </summary>
 /// <param name="policy"><see cref="LockRecursionPolicy"/> that specifies whether a lock can be entered multiple times by the same thread.</param>
 public SlimLock(LockRecursionPolicy policy)
 {
     this.rwLock = new ReaderWriterLockSlim(policy);
 }
 public EasyReaderWriterLockSlim(LockRecursionPolicy recursionPolicy)
     : base(recursionPolicy)
 {
 }
 public NamedReaderWriterLockSlim(string name, LockRecursionPolicy recursionPolicy = LockRecursionPolicy.NoRecursion)
     : base(recursionPolicy)
 {
     this.name = name;
 }
 public ReaderWriterLockStrategy(LockRecursionPolicy recursionPolicy)
 {
     _lockRecursionPolicy = recursionPolicy;
     _lock = new ReaderWriterLockSlim(recursionPolicy);
 }
 public ReaderWriterLockStrategy(LockRecursionPolicy recursionPolicy)
 {
     _lockRecursionPolicy = recursionPolicy;
     _lock = new ReaderWriterLockSlim(recursionPolicy);
 }
 public DisposableReaderWriterLock(LockRecursionPolicy recursionPolicy)
 {
     this.lockSlim = new ReaderWriterLockSlim(recursionPolicy);
 }
Beispiel #46
0
		public ReaderWriterLockSlim (LockRecursionPolicy recursionPolicy)
		{
			this.recursionPolicy = recursionPolicy;
			this.noRecursion = recursionPolicy == LockRecursionPolicy.NoRecursion;
		}
Beispiel #47
0
 public ReaderWriterLockSlimWrapper(LockRecursionPolicy recursionPolicy)
 {
     locker = new ReaderWriterLockSlim(recursionPolicy);
 }
 public static ReaderWriterLockSlim GetLockInstance(LockRecursionPolicy recursionPolicy)
 {
     return(new ReaderWriterLockSlim(recursionPolicy));
 }
 public static ReaderWriterLockSlim GetLockInstance(LockRecursionPolicy recursionPolicy)
 {
     return new ReaderWriterLockSlim(recursionPolicy);
 }
 public ReaderWriterLockSlim(LockRecursionPolicy recursionPolicy)            
 {
     if (recursionPolicy == LockRecursionPolicy.SupportsRecursion)
     {
         fIsReentrant = true;
     }            
     InitializeThreadCounts();
     fNoWaiters = true;
     lockID = Interlocked.Increment(ref s_nextLockID);
 }
		public ReaderWriterLockSlim( LockRecursionPolicy recursionPolocy ) { }
Beispiel #52
0
 public ReaderWriterLockSlim(LockRecursionPolicy recursionPolicy)
 {
 }
 internal ReaderWriterLock(string lockName, int timeOut, LockRecursionPolicy recursionPolicy)
 {
     this.lockName = lockName;
     this.lockSlim = new ReaderWriterLockSlim(recursionPolicy);
     this.TimeOut = timeOut;
 }