private void WritePageInternal(TransactionPairsPage page) { // Go to end of file. long offset = tradeData.Write(page.Buffer, 0, page.Buffer.Length); lock ( dirtyLocker) { try { if (page.PageNumber == 0) { throw new ApplicationException("Found pageNumber is 0: \n" + this); } offsets.Add(page.PageNumber, new Page(offset, page.Id)); } catch (Exception ex) { string message = "Error while adding PageNumber " + page.PageNumber + ": " + ex.Message; log.Error(message, ex); try { log.Error(message + "\n" + this, ex); } catch (Exception ex2) { log.Error("Exception while logging ToString of PairsPages: " + ex.Message, ex2); } throw new ApplicationException(message + "\n" + this, ex); } try { pagePool.Free(page); } catch (Exception ex) { throw new ApplicationException("Failure while freeing page: " + page.PageNumber + "(" + page.Id + ") :\n" + this, ex); } dirtyPages.Remove(page); } }
private int GetPageIndex(int index) { int pageNumber = HashPageNumber(index); int pageIndex = index & pageMask; if (current == null || current.PageNumber != pageNumber) { pages.TryRelease(current); current = (TransactionPairsPage)pages.GetPage(pageNumber); } return(pageIndex); }
internal void WritePage(TransactionPairsPage page) { if (asynchronous) { lock ( writeLocker) { writeQueue.Enqueue(page); } } else { WritePageInternal(page); } }
private void AssureTail() { if (count > capacity) { if (tail != null) { pages.WritePage(tail); } int pageNumber = HashPageNumber(count); tail = (TransactionPairsPage)pages.CreatePage(pageNumber, pageSize); current = tail; capacity += pageSize; } }
internal void WritePage(TransactionPairsPage page) { if (asynchronous) { for (var i = 0; i < dirtyPageList.Length; i++) { if (dirtyPageList[i] == null) { dirtyPageList[i] = page; return; } } throw new ApplicationException("No open slots in dirty page list."); } else { WritePageInternal(page); } }