From d0f8932a7514626bc6d9bf93920215b4c89e0f01 Mon Sep 17 00:00:00 2001 From: Alex Yakunin Date: Mon, 6 May 2024 12:36:20 -0700 Subject: [PATCH 1/2] feat: MemoryPackSerializer.BackupState, BackupSerializerState, BackupDeserializerState --- .../MemoryPackSerializer.StateBackup.cs | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/MemoryPack.Core/MemoryPackSerializer.StateBackup.cs diff --git a/src/MemoryPack.Core/MemoryPackSerializer.StateBackup.cs b/src/MemoryPack.Core/MemoryPackSerializer.StateBackup.cs new file mode 100644 index 0000000..0b29264 --- /dev/null +++ b/src/MemoryPack.Core/MemoryPackSerializer.StateBackup.cs @@ -0,0 +1,86 @@ +using System.Runtime.CompilerServices; + +namespace MemoryPack; + +public static partial class MemoryPackSerializer +{ + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static StateBackup BackupState() => new(true); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SerializerStateBackup BackupSerializerState() => new(true); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static DeserializerStateBackup BackupDeserializerState() => new(true); + + // Nested types + + public readonly struct StateBackup : IDisposable + { + readonly SerializerWriterThreadStaticState? _threadStaticState; + readonly MemoryPackWriterOptionalState? _threadStaticWriterOptionalState; + readonly MemoryPackReaderOptionalState? _threadStaticReaderOptionalState; + readonly bool _isValid; + + internal StateBackup(bool isValid) + { + _threadStaticState = threadStaticState; + _threadStaticWriterOptionalState = threadStaticWriterOptionalState; + _threadStaticReaderOptionalState = threadStaticReaderOptionalState; + _isValid = isValid; + } + + public void Dispose() + { + if (!_isValid) + return; + + threadStaticState = _threadStaticState; + threadStaticWriterOptionalState = _threadStaticWriterOptionalState; + threadStaticReaderOptionalState = _threadStaticReaderOptionalState; + } + } + + public readonly struct SerializerStateBackup : IDisposable + { + readonly SerializerWriterThreadStaticState? _threadStaticState; + readonly MemoryPackWriterOptionalState? _threadStaticWriterOptionalState; + readonly bool _isValid; + + internal SerializerStateBackup(bool isValid) + { + _threadStaticState = threadStaticState; + _threadStaticWriterOptionalState = threadStaticWriterOptionalState; + _isValid = isValid; + } + + public void Dispose() + { + if (!_isValid) + return; + + threadStaticState = _threadStaticState; + threadStaticWriterOptionalState = _threadStaticWriterOptionalState; + } + } + + public readonly struct DeserializerStateBackup : IDisposable + { + readonly MemoryPackReaderOptionalState? _threadStaticReaderOptionalState; + readonly bool _isValid; + + internal DeserializerStateBackup(bool isValid) + { + _threadStaticReaderOptionalState = threadStaticReaderOptionalState; + _isValid = isValid; + } + + public void Dispose() + { + if (!_isValid) + return; + + threadStaticReaderOptionalState = _threadStaticReaderOptionalState; + } + } +} From 3456984225381b94718ee81c9289da8cd5fc1c91 Mon Sep 17 00:00:00 2001 From: Alex Yakunin Date: Mon, 6 May 2024 12:51:50 -0700 Subject: [PATCH 2/2] refactor: make ResetState API slightly more convenient --- .../MemoryPackSerializer.StateBackup.cs | 96 +++++++------------ 1 file changed, 37 insertions(+), 59 deletions(-) diff --git a/src/MemoryPack.Core/MemoryPackSerializer.StateBackup.cs b/src/MemoryPack.Core/MemoryPackSerializer.StateBackup.cs index 0b29264..a101227 100644 --- a/src/MemoryPack.Core/MemoryPackSerializer.StateBackup.cs +++ b/src/MemoryPack.Core/MemoryPackSerializer.StateBackup.cs @@ -5,82 +5,60 @@ namespace MemoryPack; public static partial class MemoryPackSerializer { [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static StateBackup BackupState() => new(true); + public static StateSnapshot ResetState(bool resetReaderState = true, bool resetWriterState = true) + => new(resetReaderState, resetWriterState); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static SerializerStateBackup BackupSerializerState() => new(true); + public static StateSnapshot ResetReaderState() + => new(true, false); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static DeserializerStateBackup BackupDeserializerState() => new(true); + public static StateSnapshot ResetWriterState() + => new(false, true); // Nested types - public readonly struct StateBackup : IDisposable + public readonly struct StateSnapshot : IDisposable { + readonly bool _resetReaderState; + readonly bool _resetWriterState; readonly SerializerWriterThreadStaticState? _threadStaticState; readonly MemoryPackWriterOptionalState? _threadStaticWriterOptionalState; readonly MemoryPackReaderOptionalState? _threadStaticReaderOptionalState; - readonly bool _isValid; - internal StateBackup(bool isValid) + internal StateSnapshot(bool resetReaderState, bool resetWriterState) { - _threadStaticState = threadStaticState; - _threadStaticWriterOptionalState = threadStaticWriterOptionalState; - _threadStaticReaderOptionalState = threadStaticReaderOptionalState; - _isValid = isValid; + _resetReaderState = resetReaderState; + _resetWriterState = resetWriterState; + + if (resetReaderState) + { + _threadStaticReaderOptionalState = threadStaticReaderOptionalState; + threadStaticReaderOptionalState = null; + + } + + if (resetWriterState) + { + _threadStaticState = threadStaticState; + threadStaticState = null; + _threadStaticWriterOptionalState = threadStaticWriterOptionalState; + threadStaticWriterOptionalState = null; + } } public void Dispose() { - if (!_isValid) - return; - - threadStaticState = _threadStaticState; - threadStaticWriterOptionalState = _threadStaticWriterOptionalState; - threadStaticReaderOptionalState = _threadStaticReaderOptionalState; - } - } - - public readonly struct SerializerStateBackup : IDisposable - { - readonly SerializerWriterThreadStaticState? _threadStaticState; - readonly MemoryPackWriterOptionalState? _threadStaticWriterOptionalState; - readonly bool _isValid; - - internal SerializerStateBackup(bool isValid) - { - _threadStaticState = threadStaticState; - _threadStaticWriterOptionalState = threadStaticWriterOptionalState; - _isValid = isValid; - } - - public void Dispose() - { - if (!_isValid) - return; - - threadStaticState = _threadStaticState; - threadStaticWriterOptionalState = _threadStaticWriterOptionalState; - } - } - - public readonly struct DeserializerStateBackup : IDisposable - { - readonly MemoryPackReaderOptionalState? _threadStaticReaderOptionalState; - readonly bool _isValid; - - internal DeserializerStateBackup(bool isValid) - { - _threadStaticReaderOptionalState = threadStaticReaderOptionalState; - _isValid = isValid; - } - - public void Dispose() - { - if (!_isValid) - return; - - threadStaticReaderOptionalState = _threadStaticReaderOptionalState; + if (_resetReaderState) + { + threadStaticReaderOptionalState = _threadStaticReaderOptionalState; + } + + if (_resetWriterState) + { + threadStaticState = _threadStaticState; + threadStaticWriterOptionalState = _threadStaticWriterOptionalState; + } } } }