Exemple #1
0
        public IEnumerable <LogRowDataPoint> GetDataPoints(IEnumerable <LogRowIndex> indexes)
        {
            foreach (LogRowIndex logRowIndex in indexes)
            {
                if (!m_DataPointCache.TryGetValue(logRowIndex.RowStart, out var reference))
                {
                    LogRowDataPoint point = LogRowDataFactory.CreateDataPoint(m_PagedReader, logRowIndex);
                    reference = new WeakReference(point);
                    m_DataPointCache.Add(logRowIndex.RowStart, reference);
                }

                LogRowDataPoint dataPoint = reference.Target as LogRowDataPoint;

                //Reload data point
                if (dataPoint == null)
                {
                    dataPoint        = LogRowDataFactory.CreateDataPoint(m_PagedReader, logRowIndex);
                    reference.Target = dataPoint;
                }

                yield return(dataPoint);
            }
        }
        private void OnQueuedReadThreadExecute()
        {
            try
            {
                Trace.TraceInformation("QueuedReadThread started: {0}", m_DatabaseInstanceID);

                using (var stream = new BufferedStream(new FileStream(m_Filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 4096, FileOptions.RandomAccess), 1024 * 1024))
                {
                    //int handle;
                    WaitHandle[] handles = new WaitHandle[] { m_Quit, m_Event };

                    var pagedReader = new PagedStreamReader(stream, 4096);

                    while (WaitHandle.WaitAny(handles) == 1) // (handle = WaitHandle.WaitAny(handles)) == 0)
                    {
                        Thread.Sleep(200);                   //Wait to consolidate if more requests are coming in.

                        QueuedReadRequest[] requests = null;
                        lock (m_SyncObject)
                        {
                            if (m_Queue.Count > 0)
                            {
                                requests = m_Queue.ToArray();
                                m_Queue.Clear();
                            }
                            else
                            {
                                m_Event.Reset();
                            }
                        }

                        if (requests == null)
                        {
                            continue;
                        }

                        LinkedList <LogRowIndex> indicesList = new LinkedList <LogRowIndex>();
                        Dictionary <LogRowIndex, List <RequestPoints> > indexToRequestPoints = new Dictionary <LogRowIndex, List <RequestPoints> >();

                        foreach (var readRequest in requests)
                        {
                            var indices = m_Indexes.GetItemRows(readRequest.ItemID, readRequest.StartIndex, readRequest.Count);

                            var requestPoints = new RequestPoints(readRequest);

                            foreach (var logRowIndex in indices)
                            {
                                if (!indexToRequestPoints.TryGetValue(logRowIndex, out var list))
                                {
                                    list = new List <RequestPoints>();
                                    indexToRequestPoints.Add(logRowIndex, list);
                                }
                                list.Add(requestPoints);
                            }

                            indicesList.AddSorted(indices);
                        }



                        foreach (var logRowIndex in indicesList)
                        {
                            var point = LogRowDataFactory.CreateDataPoint(pagedReader, logRowIndex);

                            var list = indexToRequestPoints[logRowIndex];
                            foreach (var rp in list)
                            {
                                if (rp.Add(point))
                                {
                                    rp.Send(m_DatabaseInstanceID);
                                }
                            }
                        }

                        foreach (var index in indexToRequestPoints)
                        {
                            index.Value.ForEach(points => points.Send(m_DatabaseInstanceID));
                        }
                    }
                }
                Trace.TraceInformation("QueuedReadThread ended: {0}", m_DatabaseInstanceID);
            }
            catch (Exception ex)
            {
                m_Log.Fatal(ex.Message, ex);
                throw;
            }
        }