public void WriteNewLink(int pageId, out int expiredPage) { lock (_lock) { expiredPage = -1; if (_linkA.PageId < 0) { // A has never been set _linkA = new PageLink { PageId = pageId, Version = new MonotonicByte(0) }; return; } if (_linkB.PageId < 0) { // B has never been set _linkB = new PageLink { PageId = pageId, Version = _linkA.Version.GetNext() }; return; } if (_linkA.Version == _linkB.Version) { throw new Exception("VersionedLink.WriteNewLink: option table versions invalid"); } if (_linkA.Version > _linkB.Version) { // B is older. Replace it. expiredPage = _linkB.PageId; _linkB = new PageLink { PageId = pageId, Version = _linkA.Version.GetNext() }; return; } // A is older. Replace it. expiredPage = _linkA.PageId; _linkA = new PageLink { PageId = pageId, Version = _linkB.Version.GetNext() }; } }
private void WriteLink([NotNull] BinaryWriter w, PageLink link) { if (link != null) { w.Write((byte)link.Version.Value); w.Write(link.PageId); } else { w.Write((byte)0); w.Write(-1); } }
/// <inheritdoc /> public void Defrost(Stream source) { lock (_lock) { if (source == null || source.Length < ByteSize) { throw new Exception("VersionedLink.FromBytes: data was too short."); } var r = new BinaryReader(source); _linkA = new PageLink { Version = new MonotonicByte(r.ReadByte()), PageId = r.ReadInt32() }; _linkB = new PageLink { Version = new MonotonicByte(r.ReadByte()), PageId = r.ReadInt32() }; } }
public VersionedLink() { _linkA = PageLink.InvalidLink(); _linkB = PageLink.InvalidLink(); }