From 33335e6149f2d6f6ebdad64588d9fba2f0ebb49b Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Thu, 27 Oct 2011 02:49:28 +0200 Subject: NEWT/OSX NewtView: Add 'soft' pthread locking impacts: needsDisplay/displayIfNeeded, .. - Add 'soft' pthread locking (blockin) - impacts: needsDisplay/displayIfNeeded, .. - needsDisplay/displayIfNeeded also respects destroyNotifySend (ignore action if set) --- src/newt/native/NewtMacWindow.h | 16 ++++++--- src/newt/native/NewtMacWindow.m | 76 +++++++++++++++++++++++++++++++++++------ 2 files changed, 78 insertions(+), 14 deletions(-) (limited to 'src/newt/native') diff --git a/src/newt/native/NewtMacWindow.h b/src/newt/native/NewtMacWindow.h index 945948291..cb256e71f 100644 --- a/src/newt/native/NewtMacWindow.h +++ b/src/newt/native/NewtMacWindow.h @@ -32,6 +32,7 @@ */ #import +#import #import "jni.h" #include "NewtCommon.h" @@ -53,6 +54,8 @@ int jvmVersion; BOOL destroyNotifySent; + BOOL softLocked; + pthread_mutex_t softLockSync; NSTrackingRectTag ptrTrackingTag; NSRect ptrRect; @@ -60,8 +63,7 @@ } - (id)initWithFrame:(NSRect)frameRect; - -- (NSCursor *) cursor; +- (void) dealloc; /* Set during event dispatching cycle */ - (void) setJVMHandle: (JavaVM*) vm; @@ -74,12 +76,18 @@ - (void) setJavaWindowObject: (jobject) javaWindowObj; - (jobject) getJavaWindowObject; +- (void) rightMouseDown: (NSEvent*) theEvent; +- (void) resetCursorRects; +- (NSCursor *) cursor; + - (void) setDestroyNotifySent: (BOOL) v; - (BOOL) getDestroyNotifySent; -- (void) rightMouseDown: (NSEvent*) theEvent; -- (void) resetCursorRects; +- (BOOL) softLock; +- (void) softUnlock; +- (BOOL) needsDisplay; +- (void) displayIfNeeded; - (void) viewWillDraw; - (void) drawRect:(NSRect)dirtyRect; - (void) viewDidHide; diff --git a/src/newt/native/NewtMacWindow.m b/src/newt/native/NewtMacWindow.m index 43e66506c..1f74742ec 100644 --- a/src/newt/native/NewtMacWindow.m +++ b/src/newt/native/NewtMacWindow.m @@ -103,6 +103,8 @@ static jmethodID windowRepaintID = NULL; jvmHandle = NULL; jvmVersion = 0; destroyNotifySent = NO; + softLocked = NO; + pthread_mutex_init(&softLockSync, NULL); // fast non-recursive ptrTrackingTag = 0; @@ -117,6 +119,15 @@ static jmethodID windowRepaintID = NULL; return [super initWithFrame:frameRect]; } +- (void) dealloc +{ + if(softLocked) { + fprintf(stderr, "*** Warning: softLock still hold @ dealloc!\n"); fflush(NULL); + } + pthread_mutex_destroy(&softLockSync); + [super dealloc]; +} + - (void) setJVMHandle: (JavaVM*) vm { jvmHandle = vm; @@ -146,16 +157,6 @@ static jmethodID windowRepaintID = NULL; return javaWindowObject; } -- (void) setDestroyNotifySent: (BOOL) v -{ - destroyNotifySent = v; -} - -- (BOOL) getDestroyNotifySent -{ - return destroyNotifySent; -} - - (void) rightMouseDown: (NSEvent*) theEvent { NSResponder* next = [self nextResponder]; @@ -182,6 +183,61 @@ static jmethodID windowRepaintID = NULL; return myCursor; } +- (void) setDestroyNotifySent: (BOOL) v +{ + destroyNotifySent = v; +} + +- (BOOL) getDestroyNotifySent +{ + return destroyNotifySent; +} + +#define SOFT_LOCK_BLOCKING 1 + +- (BOOL) softLock +{ + pthread_mutex_lock(&softLockSync); + softLocked = YES; +#ifndef SOFT_LOCK_BLOCKING + pthread_mutex_unlock(&softLockSync); +#endif + return softLocked; +} + +- (void) softUnlock +{ +#ifndef SOFT_LOCK_BLOCKING + pthread_mutex_lock(&softLockSync); +#endif + softLocked = NO; + pthread_mutex_unlock(&softLockSync); +} + +- (BOOL) needsDisplay +{ +#ifndef SOFT_LOCK_BLOCKING + return NO == softLocked && NO == destroyNotifySent && [super needsDisplay]; +#else + return NO == destroyNotifySent && [super needsDisplay]; +#endif +} + +- (void) displayIfNeeded +{ +#ifndef SOFT_LOCK_BLOCKING + if( NO == softLocked && NO == destroyNotifySent ) { + [super displayIfNeeded]; + } +#else + [self softLock]; + if( NO == destroyNotifySent ) { + [super displayIfNeeded]; + } + [self softUnlock]; +#endif +} + - (void) viewWillDraw { DBG_PRINT("*************** viewWillDraw: 0x%p\n", javaWindowObject); -- cgit v1.2.3