private long AllocateFromSmallActiveSection(int size) { long id; if (ActiveDataSmallSection.TryAllocate(size, out id) == false) { InactiveSections.Add(_activeDataSmallSection.PageNumber); using (var it = ActiveCandidateSection.Iterate()) { if (it.Seek(long.MinValue)) { do { var sectionPageNumber = it.CurrentKey; _activeDataSmallSection = new ActiveRawDataSmallSection(_tx.LowLevelTransaction, sectionPageNumber); _activeDataSmallSection.DataMoved += OnDataMoved; if (_activeDataSmallSection.TryAllocate(size, out id)) { ActiveCandidateSection.Delete(sectionPageNumber); return(id); } } while (it.MoveNext()); } } var newNumberOfPages = Math.Max((ushort)(ActiveDataSmallSection.NumberOfPages * 2), ushort.MaxValue); _activeDataSmallSection = ActiveRawDataSmallSection.Create(_tx.LowLevelTransaction, Name, newNumberOfPages); _activeDataSmallSection.DataMoved += OnDataMoved; Slice pageNumber; var val = _activeDataSmallSection.PageNumber; using (Slice.External(_tx.Allocator, (byte *)&val, sizeof(long), out pageNumber)) { _tableTree.Add(TableSchema.ActiveSectionSlice, pageNumber); } var allocationResult = _activeDataSmallSection.TryAllocate(size, out id); Debug.Assert(allocationResult); } return(id); }
private long AllocateFromSmallActiveSection(int size) { long id; if (ActiveDataSmallSection.TryAllocate(size, out id) == false) { InactiveSections.Add(_activeDataSmallSection.PageNumber); using (var it = ActiveCandidateSection.Iterate()) { if (it.Seek(long.MinValue)) { do { var sectionPageNumber = it.CurrentKey; _activeDataSmallSection = new ActiveRawDataSmallSection(_tx.LowLevelTransaction, sectionPageNumber); if (_activeDataSmallSection.TryAllocate(size, out id)) { ActiveCandidateSection.Delete(sectionPageNumber); return(id); } } while (it.MoveNext()); } } _activeDataSmallSection = ActiveRawDataSmallSection.Create(_tx.LowLevelTransaction, Name); var pageNumber = Slice.From(_tx.Allocator, EndianBitConverter.Little.GetBytes(_activeDataSmallSection.PageNumber), ByteStringType.Immutable); _tableTree.Add(TableSchema.ActiveSection, pageNumber); var allocationResult = _activeDataSmallSection.TryAllocate(size, out id); Debug.Assert(allocationResult); } return(id); }