From dca52603345d0e1d60f4fb58305ee67a7035e812 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sat, 19 Dec 2015 15:25:33 +1300 Subject: [PATCH] -Fixed JsonWriter IDisposable implementation --- .../JsonTextWriterTest.cs | 40 +++++++++++++++++++ Src/Newtonsoft.Json/JsonWriter.cs | 7 +++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs b/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs index f01b9697..d92681b8 100644 --- a/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs +++ b/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs @@ -1552,6 +1552,15 @@ null//comment ]/*comment*/ }/*comment *//*comment 1 */", sw.ToString()); } + + [Test] + public void DisposeSupressesFinalization() + { + UnmanagedResourceFakingJsonWriter.CreateAndDispose(); + GC.Collect(); + GC.WaitForPendingFinalizers(); + Assert.AreEqual(1, UnmanagedResourceFakingJsonWriter.DisposalCalls); + } } public class CustomJsonTextWriter : JsonTextWriter @@ -1720,4 +1729,35 @@ null//comment } } #endif + + public class UnmanagedResourceFakingJsonWriter : JsonWriter + { + public static int DisposalCalls; + + public static void CreateAndDispose() + { + ((IDisposable)new UnmanagedResourceFakingJsonWriter()).Dispose(); + } + + public UnmanagedResourceFakingJsonWriter() + { + DisposalCalls = 0; + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + ++DisposalCalls; + } + + ~UnmanagedResourceFakingJsonWriter() + { + Dispose(false); + } + + public override void Flush() + { + throw new NotImplementedException(); + } + } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/JsonWriter.cs b/Src/Newtonsoft.Json/JsonWriter.cs index 67cac53a..a6bc5342 100644 --- a/Src/Newtonsoft.Json/JsonWriter.cs +++ b/Src/Newtonsoft.Json/JsonWriter.cs @@ -1437,9 +1437,14 @@ namespace Newtonsoft.Json void IDisposable.Dispose() { Dispose(true); + GC.SuppressFinalize(this); } - private void Dispose(bool disposing) + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected virtual void Dispose(bool disposing) { if (_currentState != State.Closed) {