public override void OnUpdate(LoopState state) { var inj = state.Get <Injection>(); var cache = state.Get <TokenCache>(); var iter = inj.Entity.GetEnumerator(); while (iter.MoveNext()) { var src = iter.Current; Token token; if (cache.TryGetValue(src.key, out token)) { inj.Link.Push(new TokenSource { root = token }); continue; } Page page; if (!_cache.TryGetPage(cxt.pageIndex, out page)) { continue; } inj.Context.Push(new ContextSource { key = cxt.key, body = page.body, count = cxt.count, offset = cxt.offset }); } _scheduler.ExecuteFrame(_cache); }
public void ExecuteFrame(PageCache cache) { if (0 == _waitQueue.Count) { return; } try { while (_waitQueue.Count != 0) { var key = _waitQueue.Dequeue(); PagePointer ptr; cache.AddContext(key, out ptr); Page page; if (!cache.TryGetPage(ptr.index, out page)) { _capturing.Enqueue(ptr.index); } } while (_capturing.Count != 0) { var pageIndex = _capturing.Dequeue(); Task.Factory.StartNew(() => { var page = _stream.Capture(pageIndex * Config.LENGTH_PAGE, (pageIndex + 1) * Config.LENGTH_PAGE).Flush(); page.index = pageIndex; cache.AddPage(page); }); } } catch (KeyNotFoundException e) { } catch (Exception e) { } finally { _waitQueue.Clear(); _capturing.Clear(); } }