/// <summary> /// Shift log read-only address /// </summary> /// <param name="newReadOnlyAddress">Address to shift read-only until</param> /// <param name="wait">Wait to ensure shift is complete (may involve page flushing)</param> public void ShiftReadOnlyAddress(long newReadOnlyAddress, bool wait) { if (!fht.epoch.ThisInstanceProtected()) { try { fht.epoch.Resume(); allocator.ShiftReadOnlyAddress(newReadOnlyAddress); } finally { fht.epoch.Suspend(); } // Wait for flush to complete while (wait && allocator.FlushedUntilAddress < newReadOnlyAddress) { Thread.Yield(); } } else { allocator.ShiftReadOnlyAddress(newReadOnlyAddress); // Wait for flush to complete while (wait && allocator.FlushedUntilAddress < newReadOnlyAddress) { fht.epoch.ProtectAndDrain(); } } }
/// <summary> /// Shift log read-only address /// </summary> /// <param name="newReadOnlyAddress">Address to shift read-only until</param> /// <param name="wait">Wait to ensure shift is complete (may involve page flushing)</param> public void ShiftReadOnlyAddress(long newReadOnlyAddress, bool wait) { allocator.ShiftReadOnlyAddress(newReadOnlyAddress); // Wait for flush to complete while (wait && allocator.FlushedUntilAddress < newReadOnlyAddress) { fht.Refresh(); } }
/// <summary> /// Shift log read-only address /// </summary> /// <param name="newReadOnlyAddress">Address to shift read-only until</param> /// <param name="wait">Wait to ensure shift is complete (may involve page flushing)</param> public void ShiftReadOnlyAddress(long newReadOnlyAddress, bool wait) { fht.epoch.Resume(); allocator.ShiftReadOnlyAddress(newReadOnlyAddress); fht.epoch.Suspend(); // Wait for flush to complete while (wait && allocator.FlushedUntilAddress < newReadOnlyAddress) { ; } }
/// <summary> /// Shift log read-only address /// </summary> /// <param name="newReadOnlyAddress">Address to shift read-only until</param> public bool ShiftReadOnlyAddress(long newReadOnlyAddress) { return(hlog.ShiftReadOnlyAddress(newReadOnlyAddress)); }