Exemple #1
0
        /// <summary>
        /// Shift log head address to prune memory foorprint of hybrid log
        /// </summary>
        /// <param name="newHeadAddress">Address to shift head until</param>
        /// <param name="wait">Wait for operation to complete (may involve page flushing and closing)</param>
        public void ShiftHeadAddress(long newHeadAddress, bool wait)
        {
            // First shift read-only
            // Force wait so that we do not close unflushed page
            ShiftReadOnlyAddress(newHeadAddress, true);

            // Then shift head address
            if (!fht.epoch.ThisInstanceProtected())
            {
                try
                {
                    fht.epoch.Resume();
                    allocator.ShiftHeadAddress(newHeadAddress);
                }
                finally
                {
                    fht.epoch.Suspend();
                }

                while (wait && allocator.SafeHeadAddress < newHeadAddress)
                {
                    Thread.Yield();
                }
            }
            else
            {
                allocator.ShiftHeadAddress(newHeadAddress);
                while (wait && allocator.SafeHeadAddress < newHeadAddress)
                {
                    fht.epoch.ProtectAndDrain();
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// Shift log head address to prune memory foorprint of hybrid log
        /// </summary>
        /// <param name="newHeadAddress">Address to shift head until</param>
        /// <param name="wait">Wait to ensure shift is registered (may involve page flushing)</param>
        /// <returns>When wait is false, this tells whether the shift to newHeadAddress was successfully registered with FASTER</returns>
        public bool ShiftHeadAddress(long newHeadAddress, bool wait)
        {
            // First shift read-only
            ShiftReadOnlyAddress(newHeadAddress, wait);

            // Then shift head address
            var updatedHeadAddress = allocator.ShiftHeadAddress(newHeadAddress);

            return(updatedHeadAddress >= newHeadAddress);
        }
Exemple #3
0
        /// <summary>
        /// Shift log head address to prune memory foorprint of hybrid log
        /// </summary>
        /// <param name="newHeadAddress">Address to shift head until</param>
        /// <param name="wait">Wait to ensure shift is registered (may involve page flushing)</param>
        /// <returns>When wait is false, this tells whether the shift to newHeadAddress was successfully registered with FASTER</returns>
        public bool ShiftHeadAddress(long newHeadAddress, bool wait)
        {
            // First shift read-only
            // Force wait so that we do not close unflushed page
            ShiftReadOnlyAddress(newHeadAddress, true);

            // Then shift head address
            if (!fht.epoch.ThisInstanceProtected())
            {
                fht.epoch.Resume();
                var updatedHeadAddress = allocator.ShiftHeadAddress(newHeadAddress);
                fht.epoch.Suspend();
                return(updatedHeadAddress >= newHeadAddress);
            }
            else
            {
                var updatedHeadAddress = allocator.ShiftHeadAddress(newHeadAddress);
                return(updatedHeadAddress >= newHeadAddress);
            }
        }
Exemple #4
0
        /// <summary>
        /// Shift log head address to prune memory foorprint of hybrid log
        /// </summary>
        /// <param name="newHeadAddress">Address to shift head until</param>
        /// <param name="wait">Wait to ensure shift is registered (may involve page flushing)</param>
        /// <returns>When wait is false, this tells whether the shift to newHeadAddress was successfully registered with FASTER</returns>
        public bool ShiftHeadAddress(long newHeadAddress, bool wait)
        {
            // First shift read-only
            ShiftReadOnlyAddress(newHeadAddress, wait);

            // Then shift head address
            fht.epoch.Resume();
            var updatedHeadAddress = allocator.ShiftHeadAddress(newHeadAddress);

            fht.epoch.Suspend();
            return(updatedHeadAddress >= newHeadAddress);
        }