diff options
author | Sven Gothel <[email protected]> | 2011-10-27 02:49:28 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2011-10-27 02:49:28 +0200 |
commit | 33335e6149f2d6f6ebdad64588d9fba2f0ebb49b (patch) | |
tree | b2889dde373d0f68247a09e4ac5ec77ca3fb9144 /src/newt/native/NewtMacWindow.m | |
parent | 6b857b7826cf29fe0a588d06aade217f47edfae0 (diff) |
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)
Diffstat (limited to 'src/newt/native/NewtMacWindow.m')
-rw-r--r-- | src/newt/native/NewtMacWindow.m | 76 |
1 files changed, 66 insertions, 10 deletions
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); |