From e81d8da068fff34821dd6f3c8032c41b245c51b5 Mon Sep 17 00:00:00 2001 From: thefiddler Date: Wed, 23 Jul 2014 10:08:57 +0200 Subject: [PATCH] [OpenTK] Reduce duplication in GraphicsContextBase Inheritors now take advantage of base class functionality to avoid duplicating finalizers and warning messages. --- Source/OpenTK/Graphics/GraphicsContextBase.cs | 54 ++++++++++++++-------- Source/OpenTK/Platform/Dummy/DummyGLContext.cs | 2 +- Source/OpenTK/Platform/Egl/EglContext.cs | 17 +------ Source/OpenTK/Platform/MacOS/CocoaContext.cs | 12 +---- Source/OpenTK/Platform/SDL2/Sdl2GraphicsContext.cs | 13 +----- Source/OpenTK/Platform/Windows/WinGLContext.cs | 18 +------- Source/OpenTK/Platform/X11/X11GLContext.cs | 14 +----- 7 files changed, 42 insertions(+), 88 deletions(-) diff --git a/Source/OpenTK/Graphics/GraphicsContextBase.cs b/Source/OpenTK/Graphics/GraphicsContextBase.cs index 686704c..ddfd491 100644 --- a/Source/OpenTK/Graphics/GraphicsContextBase.cs +++ b/Source/OpenTK/Graphics/GraphicsContextBase.cs @@ -1,32 +1,35 @@ #region License // -// The Open Toolkit Library License +// GraphicsContextBase.cs // -// Copyright (c) 2006 - 2009 the Open Toolkit library. +// Author: +// Stefanos A. +// +// Copyright (c) 2006-2014 Stefanos Apostolopoulos // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: // -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. // -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. // #endregion using System; using System.Collections.Generic; +using System.Diagnostics; using System.Text; using OpenTK.Platform; @@ -38,7 +41,7 @@ namespace OpenTK.Graphics #region Fields bool disposed; - + protected ContextHandle Handle; protected GraphicsMode Mode; @@ -106,7 +109,22 @@ namespace OpenTK.Graphics #region IDisposable Members - public abstract void Dispose(); + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected abstract void Dispose(bool disposing); + + #if DEBUG + ~GraphicsContextBase() + { + Dispose(false); + Debug.Print("[Warning] {0}:{1} leaked. Did you forget to call Dispose()?", + GetType().FullName, Handle); + } + #endif #endregion } diff --git a/Source/OpenTK/Platform/Dummy/DummyGLContext.cs b/Source/OpenTK/Platform/Dummy/DummyGLContext.cs index e2f06d2..ab6cead 100644 --- a/Source/OpenTK/Platform/Dummy/DummyGLContext.cs +++ b/Source/OpenTK/Platform/Dummy/DummyGLContext.cs @@ -113,7 +113,7 @@ namespace OpenTK.Platform.Dummy #region --- IDisposable Members --- - public override void Dispose() { IsDisposed = true; } + protected override void Dispose(bool disposing) { IsDisposed = true; } #endregion } diff --git a/Source/OpenTK/Platform/Egl/EglContext.cs b/Source/OpenTK/Platform/Egl/EglContext.cs index 575174f..13f8ec8 100644 --- a/Source/OpenTK/Platform/Egl/EglContext.cs +++ b/Source/OpenTK/Platform/Egl/EglContext.cs @@ -180,15 +180,9 @@ namespace OpenTK.Platform.Egl #region IDisposable Members - public override void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - // Todo: cross-reference the specs. What should happen if the context is destroyed from a different // thread? - protected virtual void Dispose(bool manual) + protected override void Dispose(bool manual) { if (!IsDisposed) { @@ -197,19 +191,10 @@ namespace OpenTK.Platform.Egl Egl.MakeCurrent(WindowInfo.Display, WindowInfo.Surface, WindowInfo.Surface, IntPtr.Zero); Egl.DestroyContext(WindowInfo.Display, HandleAsEGLContext); } - else - { - Debug.Print("[Warning] {0}:{1} was not disposed.", this.GetType().Name, HandleAsEGLContext); - } IsDisposed = true; } } - ~EglContext() - { - Dispose(false); - } - #endregion } } diff --git a/Source/OpenTK/Platform/MacOS/CocoaContext.cs b/Source/OpenTK/Platform/MacOS/CocoaContext.cs index 1d6fc34..89c17e4 100644 --- a/Source/OpenTK/Platform/MacOS/CocoaContext.cs +++ b/Source/OpenTK/Platform/MacOS/CocoaContext.cs @@ -326,17 +326,7 @@ namespace OpenTK #region IDisposable Members - ~CocoaContext() - { - Dispose(false); - } - - public override void Dispose() - { - Dispose(true); - } - - void Dispose(bool disposing) + protected override void Dispose(bool disposing) { if (IsDisposed || Handle.Handle == IntPtr.Zero) return; diff --git a/Source/OpenTK/Platform/SDL2/Sdl2GraphicsContext.cs b/Source/OpenTK/Platform/SDL2/Sdl2GraphicsContext.cs index 0fd064b..eb6f8ab 100644 --- a/Source/OpenTK/Platform/SDL2/Sdl2GraphicsContext.cs +++ b/Source/OpenTK/Platform/SDL2/Sdl2GraphicsContext.cs @@ -376,7 +376,7 @@ namespace OpenTK.Platform.SDL2 #region IDisposable Members - void Dispose(bool manual) + protected override void Dispose(bool manual) { if (!IsDisposed) { @@ -397,17 +397,6 @@ namespace OpenTK.Platform.SDL2 } } - public override void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - ~Sdl2GraphicsContext() - { - Dispose(false); - } - #endregion } } diff --git a/Source/OpenTK/Platform/Windows/WinGLContext.cs b/Source/OpenTK/Platform/Windows/WinGLContext.cs index b7da272..0e5c044 100644 --- a/Source/OpenTK/Platform/Windows/WinGLContext.cs +++ b/Source/OpenTK/Platform/Windows/WinGLContext.cs @@ -465,13 +465,7 @@ namespace OpenTK.Platform.Windows #region IDisposable Members - public override void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - private void Dispose(bool calledManually) + protected override void Dispose(bool calledManually) { if (!IsDisposed) { @@ -479,20 +473,10 @@ namespace OpenTK.Platform.Windows { DestroyContext(); } - else - { - Debug.Print("[Warning] OpenGL context {0} leaked. Did you forget to call IGraphicsContext.Dispose()?", - Handle.Handle); - } IsDisposed = true; } } - ~WinGLContext() - { - Dispose(false); - } - #region private void DestroyContext() private void DestroyContext() diff --git a/Source/OpenTK/Platform/X11/X11GLContext.cs b/Source/OpenTK/Platform/X11/X11GLContext.cs index d86a348..1b680d2 100644 --- a/Source/OpenTK/Platform/X11/X11GLContext.cs +++ b/Source/OpenTK/Platform/X11/X11GLContext.cs @@ -483,13 +483,7 @@ namespace OpenTK.Platform.X11 #region --- IDisposable Members --- - public override void Dispose() - { - this.Dispose(true); - GC.SuppressFinalize(this); - } - - private void Dispose(bool manuallyCalled) + protected override void Dispose(bool manuallyCalled) { if (!IsDisposed) { @@ -516,12 +510,6 @@ namespace OpenTK.Platform.X11 } IsDisposed = true; } - - - ~X11GLContext() - { - this.Dispose(false); - } #endregion } -- 2.7.4