Exemple #1
0
        /// <inheritdoc />
        public override UploadSession GetSession(string uploadSessionId)
        {
            try
            {
#if NET35
                _sessionsLock.EnterReadLock();
#else
                _sessionsLock.AcquireReaderLock(-1);
#endif

                UploadSession session;

                if (!_uploadSessions.TryGetValue(uploadSessionId, out session))
                {
                    session = null;
                }

                return(session);
            }
            finally
            {
#if NET35
                _sessionsLock.ExitReadLock();
#else
                _sessionsLock.ReleaseReaderLock();
#endif
            }
        }
Exemple #2
0
        /// <inheritdoc />
        public override void SaveRequest(UploadRequest request, bool isCreate)
        {
            // TODO: uncomment, add check to make sure object is the same
            //if (isCreate)
            //{
            try
            {
#if NET35
                _requestsLock.EnterUpgradeableReadLock();
#else
                _requestsLock.AcquireReaderLock(-1);
#endif
                Dictionary <string, UploadRequest> requests;

                if (!_uploadRequests.TryGetValue(request.UploadSessionId, out requests))
                {
                    requests = new Dictionary <string, UploadRequest>();

                    requests[request.UploadRequestId] = request;

#if !NET35
                    // TODO: does this break something?
                    LockCookie cookie = new LockCookie();
#endif

                    try
                    {
#if NET35
                        _requestsLock.EnterWriteLock();
#else
                        cookie = _requestsLock.UpgradeToWriterLock(-1);
#endif

                        _uploadRequests[request.UploadSessionId] = requests;
                    }
                    finally
                    {
#if NET35
                        _requestsLock.ExitWriteLock();
#else
                        _requestsLock.DowngradeFromWriterLock(ref cookie);
#endif
                    }
                }
                else
                {
                    lock (requests)
                        requests[request.UploadRequestId] = request;
                }
            }
            finally
            {
#if NET35
                _requestsLock.ExitUpgradeableReadLock();
#else
                _requestsLock.ReleaseReaderLock();
#endif
            }
            //}
        }
Exemple #3
0
        internal void GetReaderLock()
        {
            IncrementRef();

#if NET40
            _rwsObject.EnterReadLock();
#else
            _rwsObject.AcquireReaderLock(Timeout.Infinite);
#endif
        }
        public void CanAcquireReadLock()
        {
            // Setup
            var l = new ReaderWriterLockSlim();

            // Act
            l.AcquireReaderLock(100);
            Assert.IsTrue(l.IsReaderLockHeld);
            l.ReleaseReaderLock();
            Assert.IsFalse(l.IsReaderLockHeld);
        } // end of function - CanAcquireReadLock
        public void StillInReadLockAfterDowngrading()
        {
            // Setup
            var l = new ReaderWriterLockSlim();

            // Act/Verify
            l.AcquireReaderLock(0);
            Assert.IsTrue(l.IsReaderLockHeld);
            l.UpgradeToWriterLock(0);
            Assert.IsTrue(l.IsWriterLockHeld);
            Assert.IsTrue(l.IsReaderLockHeld);
            l.DowngradeFromWriterLock();
            Assert.IsFalse(l.IsWriterLockHeld);
            Assert.IsTrue(l.IsReaderLockHeld);
            l.ReleaseReaderLock();
            Assert.IsFalse(l.IsReaderLockHeld);
        } // end of function - StillInReadLockAfterDowngrading
Exemple #6
0
        public static CtorAccessor Get(Type type)
        {
            CtorAccessor ctorAccessor = null;

            try {
#if (dotNET35 || dotNET4)
                ctorAccessorsCacheLock.EnterReadLock();
#else
                ctorAccessorsCacheLock.AcquireReaderLock(-1);
#endif
                if (ctorAccessorsCache.TryGetValue(type, out ctorAccessor))
                {
                    return(ctorAccessor);
                }
            }
            finally {
#if (dotNET35 || dotNET4)
                ctorAccessorsCacheLock.ExitReadLock();
#else
                ctorAccessorsCacheLock.ReleaseReaderLock();
#endif
            }
            try {
#if (dotNET35 || dotNET4)
                ctorAccessorsCacheLock.EnterWriteLock();
#else
                ctorAccessorsCacheLock.AcquireWriterLock(-1);
#endif
                if (ctorAccessorsCache.TryGetValue(type, out ctorAccessor))
                {
                    return(ctorAccessor);
                }
                ctorAccessor             = new CtorAccessor(type);
                ctorAccessorsCache[type] = ctorAccessor;
            }
            finally {
#if (dotNET35 || dotNET4)
                ctorAccessorsCacheLock.ExitWriteLock();
#else
                ctorAccessorsCacheLock.ReleaseWriterLock();
#endif
            }
            return(ctorAccessor);
        }
        public static ObjectSerializer Get(Type type)
        {
            ObjectSerializer serializer = null;

            try {
#if (dotNET35 || dotNET4)
                serializersCacheLock.EnterReadLock();
#else
                serializersCacheLock.AcquireReaderLock(-1);
#endif
                if (serializersCache.TryGetValue(type, out serializer))
                {
                    return(serializer);
                }
            }
            finally {
#if (dotNET35 || dotNET4)
                serializersCacheLock.ExitReadLock();
#else
                serializersCacheLock.ReleaseReaderLock();
#endif
            }
            try {
#if (dotNET35 || dotNET4)
                serializersCacheLock.EnterWriteLock();
#else
                serializersCacheLock.AcquireWriterLock(-1);
#endif
                if (serializersCache.TryGetValue(type, out serializer))
                {
                    return(serializer);
                }
                serializer             = new ObjectSerializer(type);
                serializersCache[type] = serializer;
            }
            finally {
#if (dotNET35 || dotNET4)
                serializersCacheLock.ExitWriteLock();
#else
                serializersCacheLock.ReleaseWriterLock();
#endif
            }
            return(serializer);
        }
        public void EnterReadLock(int millisecondsTimeout)
        {
#if NET35_OR_GREATER || NETCOREAPP || NETSTANDARD
            if (ReaderWriterLock.IsReadLockHeld || ReaderWriterLock.IsWriteLockHeld)
            {
                return;
            }
            if (!ReaderWriterLock.TryEnterReadLock(millisecondsTimeout))
            {
                throw new TimeoutException("获取读锁超时");
            }
#else
            if (ReaderWriterLock.IsReaderLockHeld || ReaderWriterLock.IsWriterLockHeld)
            {
                return;
            }
            ReaderWriterLock.AcquireReaderLock(millisecondsTimeout);
#endif
        }
Exemple #9
0
        public virtual AbstractServiceEntry?Get(Type serviceInterface, string?name, QueryModes mode)
        {
            CheckNotDisposed();
            Ensure.Parameter.IsNotNull(serviceInterface, nameof(serviceInterface));
            Ensure.Parameter.IsInterface(serviceInterface, nameof(serviceInterface));

            IServiceId key = MakeId(serviceInterface);

            AbstractServiceEntry existing;

            using (FLock.AcquireReaderLock())
            {
                //
                // 1. eset: Vissza tudjuk adni amit kerestunk.
                //

                if (FEntries.TryGetValue(key, out existing))
                {
                    return(existing);
                }

                //
                // 2. eset: A bejegyzes generikus parjat kell majd feldolgozni.
                //

                bool hasGenericEntry = mode.HasFlag(QueryModes.AllowSpecialization) &&
                                       serviceInterface.IsGenericType &&
                                       FEntries.TryGetValue
                                       (
                    MakeId(serviceInterface.GetGenericTypeDefinition()),
                    out existing
                                       );

                //
                // 3. eset: Egyik se jott be, vagy kivetelt v NULL-t adunk vissza.
                //

                if (!hasGenericEntry)
                {
                    return(!mode.HasFlag(QueryModes.ThrowOnError)
                        ? (AbstractServiceEntry?)null
                        : throw new ServiceNotFoundException(string.Format(Resources.Culture, Resources.SERVICE_NOT_FOUND, key.FriendlyName())));
                }
            }

            Assert(existing.IsGeneric());
            Assert(mode.HasFlag(QueryModes.AllowSpecialization));

            using (FLock.AcquireWriterLock())
            {
                //
                // Kozben vki berakta mar?
                //

                if (FEntries.TryGetValue(key, out AbstractServiceEntry? specialized))
                {
                    return(specialized);
                }

                //
                // Ha nem mi vagyunk a tulajdonosok akkor ertesitjuk a tulajdonost h tipizalja o a bejegyzest
                // majd masoljuk az uj elemet sajat magunkhoz (epp ugy mint ha "orokoltuk" vna).
                //
                // Igy lehetove tesszuk h pl singleton elettartamnal a tipizalt peldany elettartamarol is a
                // deklaralo kollekcio gondoskodjon.
                //

                if (existing.Owner != this)
                {
                    specialized = existing
                                  .Owner
                                  .Get(serviceInterface, name, mode);

                    //
                    // "specialized" lehet NULL ha a "QueryModes.ThrowOnError" nem volt beallitva es "existing"
                    // nem valositja meg a "ISupportsSpecialization" interface-t.
                    //

                    return(specialized?.CopyTo(this));
                }

                //
                // Ha mi vagyunk a tulajdonosok akkor nekunk kell tipizalni majd felvenni a bejegyzest.
                //

                if (existing is ISupportsSpecialization generic)
                {
                    //
                    // Ne az "FEntries.Add(specialized, specialized)"-ot hivjuk mert a "this.Add()" virtualis.
                    //

                    Add(specialized = generic.Specialize(serviceInterface.GetGenericArguments()));
                    return(specialized);
                }

                return(!mode.HasFlag(QueryModes.ThrowOnError)
                    ? (AbstractServiceEntry?)null
                    : throw new NotSupportedException(Resources.ENTRY_CANNOT_BE_SPECIALIZED));
            }

            IServiceId MakeId(Type iface) => new ServiceId(iface, name);
        }