public List <long> AllPages(Transaction tx) { if (tx.FreeSpaceRoot.State.EntriesCount == 0) { return(new List <long>()); } using (var it = tx.FreeSpaceRoot.Iterate()) { if (it.Seek(Slice.BeforeAllKeys) == false) { return(new List <long>()); } var freePages = new List <long>(); do { var stream = it.CreateReaderForCurrent(); var current = new StreamBitArray(stream); var currentSectionId = it.CurrentKey.CreateReader().ReadBigEndianInt64(); for (var i = 0; i < NumberOfPagesInSection; i++) { if (current.Get(i)) { freePages.Add(currentSectionId * NumberOfPagesInSection + i); } } } while (it.MoveNext()); return(freePages); } }
private bool TryFindContinuousRange(LowLevelTransaction tx, FixedSizeTree freeSpaceTree, FixedSizeTree.IFixedSizeIterator it, int num, StreamBitArray current, long currentSectionId, out long?page) { page = -1; var start = -1; var count = 0; for (int i = 0; i < NumberOfPagesInSection; i++) { if (current.Get(i)) { if (start == -1) { start = i; } count++; if (count == num) { page = currentSectionId * NumberOfPagesInSection + start; break; } } else { start = -1; count = 0; } } if (count != num) { return(false); } if (current.SetCount == num) { freeSpaceTree.Delete(it.CurrentKey); } else { for (int i = 0; i < num; i++) { current.Set(i + start, false); } Slice val; using (current.ToSlice(tx.Allocator, out val)) freeSpaceTree.Add(it.CurrentKey, val); } return(true); }
private bool TryFindContinuousRange(Transaction tx, TreeIterator it, int num, StreamBitArray current, long currentSectionId, out long?page) { page = -1; var start = -1; var count = 0; for (int i = 0; i < NumberOfPagesInSection; i++) { if (current.Get(i)) { if (start == -1) { start = i; } count++; if (count == num) { page = currentSectionId * NumberOfPagesInSection + start; break; } } else { start = -1; count = 0; } } if (count != num) { return(false); } if (current.SetCount == num) { tx.State.FreeSpaceRoot.Delete(it.CurrentKey); } else { for (int i = 0; i < num; i++) { current.Set(i + start, false); } tx.State.FreeSpaceRoot.Add(it.CurrentKey, current.ToStream()); } return(true); }
public List <long> AllPages(LowLevelTransaction tx) { var freeSpaceTree = GetFreeSpaceTree(tx); if (freeSpaceTree.NumberOfEntries == 0) { return(new List <long>()); } using (var it = freeSpaceTree.Iterate()) { if (it.Seek(0) == false) { return(new List <long>()); } var freePages = new List <long>(); do { var stream = it.CreateReaderForCurrent(); var current = new StreamBitArray(stream); var currentSectionId = it.CurrentKey; for (var i = 0; i < NumberOfPagesInSection; i++) { if (current.Get(i)) { freePages.Add(currentSectionId * NumberOfPagesInSection + i); } } } while (it.MoveNext()); return(freePages); } }
private bool TryFindContinuousRange(Transaction tx, TreeIterator it, int num, StreamBitArray current, long currentSectionId, out long? page) { page = -1; var start = -1; var count = 0; for (int i = 0; i < NumberOfPagesInSection; i++) { if (current.Get(i)) { if (start == -1) start = i; count++; if (count == num) { page = currentSectionId * NumberOfPagesInSection + start; break; } } else { start = -1; count = 0; } } if (count != num) return false; if (current.SetCount == num) { tx.FreeSpaceRoot.Delete(it.CurrentKey); } else { for (int i = 0; i < num; i++) { current.Set(i + start, false); } tx.FreeSpaceRoot.Add(it.CurrentKey, current.ToStream()); } return true; }