Example #1
0
        private static List <T> GetDataAccessors <T>(
            LinkedList <Util.WeakReferenceT <T> > list
            , IRepositoryFolder folder
            , bool subtree
            , bool firstOnly)
            where T : class, IRepositoryDataAccessor
        {
            List <T> retval = new List <T>();

            for (LinkedListNode <Util.WeakReferenceT <T> > node = list.First; node != null;)
            {
                LinkedListNode <Util.WeakReferenceT <T> > nextNode = node.Next;
                IRepositoryDataAccessor accessor = node.Value.Target;
                if (accessor == null)
                {
                    _logger.Info("Purging dead accessor");
                    list.Remove(node);
                }
                else
                {
                    if (accessor.IsAccessing(RepositoryFolder.CastFolder(folder, "folder"), subtree))
                    {
                        _logger.InfoFormat("GetDataAccessors found alive writer for {0}", folder.LogicalPath);
                        retval.Add((T)accessor);
                        if (firstOnly)
                        {
                            break;
                        }
                    }
                }
                node = nextNode;
            }
            return(retval);
        }
Example #2
0
        /// <summary>
        ///     Register new writer instance
        /// </summary>
        /// <param name="writer">
        ///     New writer instance
        /// </param>
        /// <remarks>
        ///		Access to readers and writers registry is synchronised; all concurrent calls accessing registry of readers and writers
        ///		will wait until this method finishes.
        ///     The writer does not need to be de-registered, only weak reference is stored and it will be purged after being garbage
        ///     collected.
        /// </remarks>
        public void RegisterWriter(IRepositoryDataAccessor writer)
        {
            CheckNotDisposed();
            Check.DoRequireArgumentNotNull(writer, "writer");
            Exceptions.DifferentRepositoriesExceptionHelper.Check(this, writer.Repository);

            _dataAccessorRegistryLock.EnterWriteLock();
            try
            {
                RemoveDeadReferences(_writers);
                _writers.AddLast(new Util.WeakReferenceT <IRepositoryDataAccessor>(writer));
            }
            finally
            {
                _dataAccessorRegistryLock.ExitWriteLock();
            }
        }
Example #3
0
        /// <summary>
        ///     De-register writer which is being disposed.
        /// </summary>
        /// <param name="writer">
        ///     The writer being disposed (must not work afterwards).
        /// </param>
        /// <returns>
        ///		Whether the writer has been unregistered (false if it was not registered).
        /// </returns>
        public bool UnRegisterWriter(IRepositoryDataAccessor writer)
        {
            CheckNotDisposed();
            Check.DoRequireArgumentNotNull(writer, "writer");
            Exceptions.DifferentRepositoriesExceptionHelper.Check(this, writer.Repository);
            bool retval;

            _dataAccessorRegistryLock.EnterWriteLock();
            try
            {
                retval = RemoveReferences(_writers, writer);
            }
            finally
            {
                _dataAccessorRegistryLock.ExitWriteLock();
            }
            return(retval);
        }
Example #4
0
 public static void CheckRepositoryNotDisposed(IRepositoryDataAccessor accessor)
 {
     CheckRepositoryNotDisposed(accessor.Repository);
 }