From 760e38eeba74a1c05d9abb5b829662a0b090b6af Mon Sep 17 00:00:00 2001 From: Nick Bolton Date: Mon, 16 Sep 2013 15:21:36 +0000 Subject: [PATCH] added some hacky sleeps to temporarily fix some thread timing issues (causing access violations). the best fix would be to use wait cond vars, but first we need to really understand the bug. --- src/lib/platform/COSXDragSimulator.m | 7 +++++++ src/lib/platform/COSXScreen.cpp | 7 ++++++- src/lib/synergy/CApp.cpp | 9 ++++++++- src/lib/synergy/CApp.h | 3 ++- src/lib/synergy/CClientApp.cpp | 15 ++++++--------- src/lib/synergy/CClientApp.h | 2 -- src/lib/synergy/CServerApp.cpp | 13 +++++-------- src/lib/synergy/CServerApp.h | 3 --- 8 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/lib/platform/COSXDragSimulator.m b/src/lib/platform/COSXDragSimulator.m index b85cdb22b..ee073465c 100644 --- a/src/lib/platform/COSXDragSimulator.m +++ b/src/lib/platform/COSXDragSimulator.m @@ -26,9 +26,14 @@ COSXDragView* g_dragView = NULL; void runCocoaApp() { + // HACK: sleep, carbon loop should start first. + usleep(1000000); + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + NSApplication* app = [[NSApplication alloc] init]; + NSWindow* window = [[NSWindow alloc] initWithContentRect: NSMakeRect(0, 0, 100, 4) styleMask: NSBorderlessWindowMask @@ -44,8 +49,10 @@ runCocoaApp() g_dragView = dragView; [window setContentView: dragView]; + NSLog(@"starting cocoa loop"); [app run]; + NSLog(@"cocoa: release"); [pool release]; } diff --git a/src/lib/platform/COSXScreen.cpp b/src/lib/platform/COSXScreen.cpp index 194c34631..fd0f675ef 100644 --- a/src/lib/platform/COSXScreen.cpp +++ b/src/lib/platform/COSXScreen.cpp @@ -1691,8 +1691,13 @@ COSXScreen::watchSystemPowerThread(void*) return; } - // start the run loop LOG((CLOG_DEBUG "started watchSystemPowerThread")); + + // HACK: sleep, this seem to stop synergy from freezing. + ARCH->sleep(1); + + // start the run loop + LOG((CLOG_DEBUG "starting carbon loop")); CFRunLoopRun(); // cleanup diff --git a/src/lib/synergy/CApp.cpp b/src/lib/synergy/CApp.cpp index 6c4410177..b72fd9395 100644 --- a/src/lib/synergy/CApp.cpp +++ b/src/lib/synergy/CApp.cpp @@ -385,5 +385,12 @@ CApp::handleIpcMessage(const CEvent& e, void*) if (m->type() == kIpcShutdown) { LOG((CLOG_INFO "got ipc shutdown message")); m_events->addEvent(CEvent(CEvent::kQuit)); - } + } +} + +void +CApp::runEventsLoop(void*) +{ + m_events->cacheCurrentEventQueueRef(); + m_events->loop(); } diff --git a/src/lib/synergy/CApp.h b/src/lib/synergy/CApp.h index 98bb80a32..9a84113b7 100644 --- a/src/lib/synergy/CApp.h +++ b/src/lib/synergy/CApp.h @@ -112,9 +112,11 @@ protected: virtual bool parseArg(const int& argc, const char* const* argv, int& i); void initIpcClient(); void cleanupIpcClient(); + void runEventsLoop(void*); IArchTaskBarReceiver* m_taskBarReceiver; bool m_suspended; + IEventQueue* m_events; private: CArgsBase* m_args; @@ -123,7 +125,6 @@ private: CreateTaskBarReceiverFunc m_createTaskBarReceiver; ARCH_APP_UTIL m_appUtil; CIpcClient* m_ipcClient; - IEventQueue* m_events; CSocketMultiplexer* m_socketMultiplexer; CString m_fileTransferSrc; CString m_fileTransferDes; diff --git a/src/lib/synergy/CClientApp.cpp b/src/lib/synergy/CClientApp.cpp index 0bee70f93..065696d6e 100644 --- a/src/lib/synergy/CClientApp.cpp +++ b/src/lib/synergy/CClientApp.cpp @@ -61,7 +61,6 @@ CClientApp::CClientApp(IEventQueue* events, CreateTaskBarReceiverFunc createTaskBarReceiver) : CApp(events, createTaskBarReceiver, new CArgs()), - m_events(events), s_client(NULL), s_clientScreen(NULL) { @@ -535,12 +534,17 @@ CClientApp::mainLoop() // later. the timer installed by startClient() will take care of // that. DAEMON_RUNNING(true); - + #if defined(MAC_OS_X_VERSION_10_7) + CThread thread( new TMethodJob( this, &CClientApp::runEventsLoop, NULL)); + + // HACK: sleep, allow queue to start. + ARCH->sleep(1); + runCocoaApp(); #else m_events->loop(); @@ -626,10 +630,3 @@ CClientApp::startNode() m_bye(kExitFailed); } } - -void -CClientApp::runEventsLoop(void*) -{ - m_events->cacheCurrentEventQueueRef(); - m_events->loop(); -} diff --git a/src/lib/synergy/CClientApp.h b/src/lib/synergy/CClientApp.h index a19c81fda..03cd9ce30 100644 --- a/src/lib/synergy/CClientApp.h +++ b/src/lib/synergy/CClientApp.h @@ -87,10 +87,8 @@ public: private: virtual bool parseArg(const int& argc, const char* const* argv, int& i); - void runEventsLoop(void*); private: CClient* s_client; CScreen* s_clientScreen; - IEventQueue* m_events; }; diff --git a/src/lib/synergy/CServerApp.cpp b/src/lib/synergy/CServerApp.cpp index d20502be8..3ee62f220 100644 --- a/src/lib/synergy/CServerApp.cpp +++ b/src/lib/synergy/CServerApp.cpp @@ -63,7 +63,6 @@ CServerApp::CServerApp(IEventQueue* events, CreateTaskBarReceiverFunc createTaskBarReceiver) : CApp(events, createTaskBarReceiver, new CArgs()), - m_events(events), s_server(NULL), s_serverState(kUninitialized), s_serverScreen(NULL), @@ -788,10 +787,15 @@ CServerApp::mainLoop() DAEMON_RUNNING(true); #if defined(MAC_OS_X_VERSION_10_7) + CThread thread( new TMethodJob( this, &CServerApp::runEventsLoop, NULL)); + + // HACK: sleep, allow queue to start. + ARCH->sleep(1); + runCocoaApp(); #else m_events->loop(); @@ -915,10 +919,3 @@ CServerApp::startNode() m_bye(kExitFailed); } } - -void -CServerApp::runEventsLoop(void*) -{ - m_events->cacheCurrentEventQueueRef(); - m_events->loop(); -} diff --git a/src/lib/synergy/CServerApp.h b/src/lib/synergy/CServerApp.h index 8bc86e194..bc1b31dd5 100644 --- a/src/lib/synergy/CServerApp.h +++ b/src/lib/synergy/CServerApp.h @@ -121,12 +121,9 @@ public: CClientListener* s_listener; CEventQueueTimer* s_timer; - IEventQueue* m_events; - private: virtual bool parseArg(const int& argc, const char* const* argv, int& i); void handleScreenSwitched(const CEvent&, void* data); - void runEventsLoop(void*); }; // configuration file name