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); }
/// <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(); } }
/// <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); }
public static void CheckRepositoryNotDisposed(IRepositoryDataAccessor accessor) { CheckRepositoryNotDisposed(accessor.Repository); }