public async Task <Stream> CreateAsync(IDocument entry, CancellationToken ct) { int i = 0; Stream ret = null; for (; i < FileChain.Length; i++) { var v = await FileChain[i].TryCreateAsync(entry, ct); if (v.success || i >= FileChain.Length - 1) { ret = v.result; break; } } ret = new PushReadStream(ret); for (i--; i >= 0; i--) { await FileChain[i].TryCreateAsync_Bubbleup(entry, ret, ct); } await CacheManager.Flush_CreateAsync(entry); return(ret); }
public DocumentCacheStreamListener(PushReadStream stream, DocumentCache cache, string cacheName) : this() { Stream = stream; Cache = cache; CacheName = cacheName; tmpCache = new List <byte>(16); valid = true; }
public async Task TryOpenReadAsync_Bubbleup(IDocument entry, Stream result, CancellationToken ct) { string name = entry.FullPath(); if (!IgnoreIgnoreCache && RequestLockManager.GetStatus(name).Is(RequestStatus.IgnoreCache)) { return; } if (result.CanSeek) { if (result is IDelayedDisposable) { (result as IDelayedDisposable).OnDisposeAsync.Add(async() => { result.Position = 0; await Store.TryPut(name, result); }); } else { await Store.TryPut(name, result); result.Position = 0; } RequestLockManager.AddStatus(name, RequestStatus.Cached); } else if (result is PushReadStream && !RequestLockManager.GetStatus(name).Is(RequestStatus.IgnoreCache) && await Allocator.TryAllocate(name, () => Task.FromResult(entry), () => Task.FromResult(result)) ) { PushReadStream prs = result as PushReadStream; prs.AddListener(new DocumentCacheStreamListener(prs, this, name)); RequestLockManager.AddStatus(name, RequestStatus.Cached); } }