Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
        }
Exemple #3
0
 internal void WritePage(TransactionPairsPage page)
 {
     if (asynchronous)
     {
         lock ( writeLocker) {
             writeQueue.Enqueue(page);
         }
     }
     else
     {
         WritePageInternal(page);
     }
 }
Exemple #4
0
 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);
     }
 }