diff options
author | Sven Gothel <[email protected]> | 2013-03-19 00:00:18 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2013-03-19 00:00:18 +0100 |
commit | 12e868f79938f44eba6f50313f977be76d8ea2bb (patch) | |
tree | d49306c3430ec03152322d365a66bdc6d878e79c /src/jogl/native/macosx | |
parent | 4457b343fe8eba3f2da096a72e38b1aac978ffd5 (diff) |
MyNSOpenGLContext::dealloc: Avoid 'invalid context'
Diffstat (limited to 'src/jogl/native/macosx')
-rw-r--r-- | src/jogl/native/macosx/MacOSXWindowSystemInterface-calayer.m | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/jogl/native/macosx/MacOSXWindowSystemInterface-calayer.m b/src/jogl/native/macosx/MacOSXWindowSystemInterface-calayer.m index 96783c75d..0f1073c9d 100644 --- a/src/jogl/native/macosx/MacOSXWindowSystemInterface-calayer.m +++ b/src/jogl/native/macosx/MacOSXWindowSystemInterface-calayer.m @@ -112,18 +112,40 @@ extern GLboolean glIsVertexArray (GLuint array); #endif +#ifdef VERBOSE_ON + #define CGLRETAINCOUNT(c) (NULL!=c?(int)CGLGetContextRetainCount(c):-1) +#else + #define CGLRETAINCOUNT(c) +#endif + - (void)dealloc { + /** + * The explicit CGLContext destruction below + * ensures that it is not left behind. + * Tests show that w/o these gymnastics, the CGLContext is not freed immediately after calling dealloc. + * The retain, release and dealloc ensures [super dealloc] won't message 'invalid context'. + */ CGLContextObj cglCtx = [self CGLContextObj]; - DBG_PRINT("MyNSOpenGLContext::dealloc.0 %p (refcnt %d) - CGL-Ctx %p\n", self, (int)[self retainCount], cglCtx); + DBG_PRINT("MyNSOpenGLContext::dealloc.0 %p (refcnt %d) - CGL-Ctx %p\n", self, (int)[self retainCount], cglCtx, CGLRETAINCOUNT(cglCtx)); // NSLog(@"MyNSOpenGLContext::dealloc: %@",[NSThread callStackSymbols]); + [self clearDrawable]; + DBG_PRINT("MyNSOpenGLContext.dealloc.1 %d\n", CGLRETAINCOUNT(cglCtx)); if( NULL != cglCtx ) { - CGLDestroyContext( cglCtx ); + CGLRetainContext( cglCtx ); + DBG_PRINT("MyNSOpenGLContext.dealloc.2 %d\n", CGLRETAINCOUNT(cglCtx)); } [super dealloc]; - // DBG_PRINT("MyNSOpenGLContext.dealloc.X: %p\n", self); + DBG_PRINT("MyNSOpenGLContext.dealloc.3 %d\n", CGLRETAINCOUNT(cglCtx)); + if( NULL != cglCtx ) { + CGLReleaseContext( cglCtx ); + DBG_PRINT("MyNSOpenGLContext.dealloc.4 %d\n", CGLRETAINCOUNT(cglCtx)); + CGLDestroyContext( cglCtx ); + DBG_PRINT("MyNSOpenGLContext.dealloc.5 %d\n", CGLRETAINCOUNT(cglCtx)); + } + DBG_PRINT("MyNSOpenGLContext.dealloc.X\n"); } @end |