Skip to content

Commit 424ceda

Browse files
committed
JBR-8651 Pycharm Crashing after lock/sleep: SIGABRT at # C [libsystem_kernel.dylib+0x9388] __pthread_kill / __displaycb_handle_block_invoke
Minimal changes for JBR-21: added @try/&@catch(nsexception) in ThreadUtilities.processQueuedCallbacks() to handle any native or java exception and avoid crashing the main run loop
1 parent 85a68d4 commit 424ceda

2 files changed

Lines changed: 18 additions & 7 deletions

File tree

src/java.desktop/macosx/native/libawt_lwawt/awt/CGraphicsEnv.m

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@
116116
(CGDirectDisplayID displayId, CGDisplayChangeSummaryFlags flags, void *userInfo)
117117
{
118118
AWT_ASSERT_APPKIT_THREAD;
119+
JNIEnv *env = [ThreadUtilities getJNIEnv];
119120
JNI_COCOA_ENTER(env);
120121

121122
if (TRACE_DISPLAY_CALLBACKS) {
@@ -152,7 +153,6 @@
152153
block:^()
153154
{
154155
@try {
155-
JNIEnv *env = [ThreadUtilities getJNIEnv];
156156
jobject graphicsEnv = (*env)->NewLocalRef(env, cgeRef);
157157
if (graphicsEnv == NULL) return; // ref already GC'd
158158
DECLARE_CLASS(jc_CGraphicsEnvironment, "sun/awt/CGraphicsEnvironment");
@@ -173,7 +173,6 @@
173173

174174
// braces to reduce variable scope
175175
{
176-
JNIEnv *env = [ThreadUtilities getJNIEnv];
177176
jobject graphicsEnv = (*env)->NewLocalRef(env, cgeRef);
178177
if (graphicsEnv == NULL) return; // ref already GC'd
179178
DECLARE_CLASS(jc_CGraphicsEnvironment, "sun/awt/CGraphicsEnvironment");

src/java.desktop/macosx/native/libosxapp/ThreadUtilities.m

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,11 @@ + (void)setAppkitThreadGroup:(jobject)group {
254254
* Note : if waiting cross-thread, possibly the stack allocated copy is accessible ?
255255
*/
256256
+ (void)invokeBlockCopy:(void (^)(void))blockCopy {
257-
blockCopy();
258-
Block_release(blockCopy);
257+
@try {
258+
blockCopy();
259+
} @finally {
260+
Block_release(blockCopy);
261+
}
259262
}
260263

261264
+ (NSString*)getCaller:(NSString*)prefixSymbol {
@@ -780,9 +783,18 @@ - (void)processQueuedCallbacks {
780783
const NSUInteger count = [self.queue count];
781784
if (count != 0) {
782785
for (NSUInteger i = 0; i < count; i++) {
783-
void (^blockCopy)(void) = (void (^)())[self.queue objectAtIndex: i];
784-
// invoke callback:
785-
[ThreadUtilities invokeBlockCopy:blockCopy];
786+
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
787+
@try {
788+
void (^blockCopy)(void) = (void (^)())[self.queue objectAtIndex: i];
789+
// invoke callback:
790+
[ThreadUtilities invokeBlockCopy:blockCopy];
791+
} @catch (NSException *exception) {
792+
// handle any exception to avoid crashing the main run loop:
793+
NSLog(@"Apple AWT Cocoa Exception: %@", [exception description]);
794+
NSLog(@"Apple AWT Cocoa Exception callstack: %@", [exception callStackSymbols]);
795+
} @finally {
796+
[pool drain];
797+
}
786798
}
787799
// reset queue anyway:
788800
[self reset];

0 commit comments

Comments
 (0)