Broke the autorelease code out into a class and replaced the usage.
This commit is contained in:
parent
a7ddb543a9
commit
3cf07ff790
3 changed files with 40 additions and 17 deletions
|
@ -137,6 +137,7 @@
|
|||
<Compile Include="Platform\Egl\EglUnixContext.cs" />
|
||||
<Compile Include="Platform\Egl\EglWinContext.cs" />
|
||||
<Compile Include="Platform\Egl\EglAnglePlatformFactory.cs" />
|
||||
<Compile Include="Platform\MacOS\Cocoa\NSAutoreleasePool.cs" />
|
||||
<Compile Include="Platform\MappedGamePadDriver.cs" />
|
||||
<Compile Include="Platform\Windows\Bindings\HidProtocol.cs" />
|
||||
<Compile Include="Platform\Windows\WinInputBase.cs" />
|
||||
|
|
34
src/OpenTK/Platform/MacOS/Cocoa/NSAutoreleasePool.cs
Normal file
34
src/OpenTK/Platform/MacOS/Cocoa/NSAutoreleasePool.cs
Normal file
|
@ -0,0 +1,34 @@
|
|||
using System;
|
||||
|
||||
namespace OpenTK.Platform.MacOS
|
||||
{
|
||||
/// <summary>
|
||||
/// The <see cref="NSAutoreleasePool"/> class is a wrapper around the native objective-C NSAutoreleasePool.
|
||||
/// In particular, this construct mimics the usage of an @autorelease block and can be used in much the same way,
|
||||
/// only with a C# using block instead.
|
||||
/// </summary>
|
||||
public sealed class NSAutoreleasePool : IDisposable
|
||||
{
|
||||
private readonly IntPtr _autoreleasePool;
|
||||
|
||||
/// <summary>
|
||||
/// Allocates and initializes a new <see cref="NSAutoreleasePool"/>.
|
||||
/// </summary>
|
||||
public NSAutoreleasePool()
|
||||
{
|
||||
_autoreleasePool = Cocoa.SendIntPtr(Class.NSAutoreleasePool, Selector.Get("alloc"));
|
||||
_autoreleasePool = Cocoa.SendIntPtr(_autoreleasePool, Selector.Get("init"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Disposes of the <see cref="NSAutoreleasePool"/> instance, draining it.
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{
|
||||
if (_autoreleasePool != IntPtr.Zero)
|
||||
{
|
||||
Cocoa.SendVoid(_autoreleasePool, Selector.Get("drain"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -54,8 +54,6 @@ namespace OpenTK
|
|||
"/System/Library/Frameworks/OpenGL.framework/OpenGLES",
|
||||
AddImageFlags.ReturnOnError);
|
||||
|
||||
private IntPtr autoreleasePool;
|
||||
|
||||
static CocoaContext()
|
||||
{
|
||||
Cocoa.Initialize();
|
||||
|
@ -119,10 +117,6 @@ namespace OpenTK
|
|||
|
||||
private void CreateContext(GraphicsMode mode, CocoaWindowInfo cocoaWindow, IntPtr shareContextRef, int majorVersion, int minorVersion, bool fullscreen)
|
||||
{
|
||||
// Create a new autorelease pool for allocations in this context (mach ports, etc)
|
||||
autoreleasePool = Cocoa.SendIntPtr(Class.NSAutoreleasePool, Selector.Get("alloc"));
|
||||
autoreleasePool = Cocoa.SendIntPtr(autoreleasePool, Selector.Get("init"));
|
||||
|
||||
// Prepare attributes
|
||||
IntPtr pixelFormat = SelectPixelFormat(mode, majorVersion, minorVersion);
|
||||
if (pixelFormat == IntPtr.Zero)
|
||||
|
@ -346,22 +340,16 @@ namespace OpenTK
|
|||
|
||||
Debug.Print("Disposing of Cocoa context.");
|
||||
|
||||
if (!NSApplication.IsUIThread)
|
||||
{
|
||||
return;
|
||||
}
|
||||
using (var pool = new NSAutoreleasePool())
|
||||
{if (!NSApplication.IsUIThread)
|
||||
{ return;}
|
||||
|
||||
if (IsCurrent)
|
||||
{
|
||||
Cocoa.SendVoid(NSOpenGLContext, Selector.Get("clearCurrentContext"));
|
||||
}
|
||||
{ Cocoa.SendVoid(NSOpenGLContext, Selector.Get("clearCurrentContext"));}
|
||||
Cocoa.SendVoid(Handle.Handle, Selector.Get("clearDrawable"));
|
||||
Cocoa.SendVoid(Handle.Handle, Selector.Get("release"));
|
||||
|
||||
// Drain the autorelease pool for the context, closing mach ports (if there is one)
|
||||
if (autoreleasePool != IntPtr.Zero)
|
||||
{
|
||||
Cocoa.SendVoid(autoreleasePool, Selector.Get("drain"));
|
||||
|
||||
}
|
||||
|
||||
Handle = ContextHandle.Zero;
|
||||
|
|
Loading…
Reference in a new issue