public long?TryAllocateFromFreeSpace(LowLevelTransaction tx, int num)
        {
            if (tx.RootObjects == null)
            {
                return(null);
            }

            if (_disableStatus.DisableCount > 0)
            {
                return(null);
            }

            if (_guard.IsProcessingFixedSizeTree)
            {
                return(null);
            }

            using (_guard.Enter(tx))
            {
                var freeSpaceTree = GetFreeSpaceTree(tx);

                if (freeSpaceTree.NumberOfEntries == 0)
                {
                    return(null);
                }

                using (var it = freeSpaceTree.Iterate())
                {
                    if (it.Seek(0) == false)
                    {
                        return(null);
                    }

                    if (num < NumberOfPagesInSection)
                    {
                        return(TryFindSmallValue(tx, freeSpaceTree, it, num));
                    }
                    return(TryFindLargeValue(tx, freeSpaceTree, it, num));
                }
            }
        }
Exemple #2
0
        public long?TryAllocateFromFreeSpace(Transaction tx, int num)
        {
            if (tx.State.FreeSpaceRoot == null)
            {
                return(null); // initial setup
            }
            if (tx.FreeSpaceRoot.State.EntriesCount == 0)
            {
                return(null);
            }

            if (_disableStatus.DisableCount > 0)
            {
                return(null);
            }

            if (_guard.IsEntered)
            {
                return(null);
            }

            using (_guard.Enter(tx))
            {
                using (var it = tx.FreeSpaceRoot.Iterate())
                {
                    if (it.Seek(Slice.BeforeAllKeys) == false)
                    {
                        return(null);
                    }

                    if (num < NumberOfPagesInSection)
                    {
                        return(TryFindSmallValue(tx, it, num));
                    }
                    return(TryFindLargeValue(tx, it, num));
                }
            }
        }