示例#1
0
        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);
        }
示例#2
0
        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();
            }
        }