Moved the autorelease pool to the context.

This commit is contained in:
Jarl Gullberg 2017-06-29 12:43:19 +02:00
parent 5828203f8e
commit a7ddb543a9
No known key found for this signature in database
GPG key ID: 750FF6F6BDA72D23
2 changed files with 13 additions and 8 deletions

View file

@ -54,6 +54,8 @@ namespace OpenTK
"/System/Library/Frameworks/OpenGL.framework/OpenGLES", "/System/Library/Frameworks/OpenGL.framework/OpenGLES",
AddImageFlags.ReturnOnError); AddImageFlags.ReturnOnError);
private IntPtr autoreleasePool;
static CocoaContext() static CocoaContext()
{ {
Cocoa.Initialize(); Cocoa.Initialize();
@ -117,6 +119,10 @@ namespace OpenTK
private void CreateContext(GraphicsMode mode, CocoaWindowInfo cocoaWindow, IntPtr shareContextRef, int majorVersion, int minorVersion, bool fullscreen) 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 // Prepare attributes
IntPtr pixelFormat = SelectPixelFormat(mode, majorVersion, minorVersion); IntPtr pixelFormat = SelectPixelFormat(mode, majorVersion, minorVersion);
if (pixelFormat == IntPtr.Zero) if (pixelFormat == IntPtr.Zero)
@ -352,6 +358,12 @@ namespace OpenTK
Cocoa.SendVoid(Handle.Handle, Selector.Get("clearDrawable")); Cocoa.SendVoid(Handle.Handle, Selector.Get("clearDrawable"));
Cocoa.SendVoid(Handle.Handle, Selector.Get("release")); 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; Handle = ContextHandle.Zero;
IsDisposed = true; IsDisposed = true;

View file

@ -137,7 +137,7 @@ namespace OpenTK.Platform.MacOS
} }
private CocoaWindowInfo windowInfo; private CocoaWindowInfo windowInfo;
private IntPtr autoreleasePool;
private IntPtr windowClass; private IntPtr windowClass;
private IntPtr trackingArea; private IntPtr trackingArea;
private IntPtr current_icon_handle; private IntPtr current_icon_handle;
@ -158,10 +158,6 @@ namespace OpenTK.Platform.MacOS
public CocoaNativeWindow(int x, int y, int width, int height, string title, GraphicsMode mode, GameWindowFlags options, DisplayDevice device) public CocoaNativeWindow(int x, int y, int width, int height, string title, GraphicsMode mode, GameWindowFlags options, DisplayDevice device)
{ {
// Create a new autorelease pool for allocations in this window (mach ports, etc)
autoreleasePool = Cocoa.SendIntPtr(Class.NSAutoreleasePool, Selector.Get("alloc"));
autoreleasePool = Cocoa.SendIntPtr(autoreleasePool, Selector.Get("init"));
// Create callback methods. We need to store those, // Create callback methods. We need to store those,
// otherwise the GC may collect them while they are // otherwise the GC may collect them while they are
// still active. // still active.
@ -1288,9 +1284,6 @@ namespace OpenTK.Platform.MacOS
Debug.Print("[Mac] Disposing {0}", windowInfo); Debug.Print("[Mac] Disposing {0}", windowInfo);
windowInfo.Dispose(); windowInfo.Dispose();
// Drain the autorelease pool for the application, closing mach ports
Cocoa.SendVoid(autoreleasePool, Selector.Get("drain"));
} }
else else
{ {