/// <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(); } } }
/// <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); }
/// <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); } }
/// <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); }