From d054a817be89c2827f53cd17c2df42ef01e4f4e1 Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Sun, 31 Mar 2013 21:54:33 +0300 Subject: Revert "Try redrawing in multiple phases to avoid blocking the UI thread too long" This reverts commit 3aae02d02d418222b0b51748008ed5c9c1f1d3c2. --- vcl/ios/iosinst.cxx | 48 ++++++++++++------------------------------------ 1 file changed, 12 insertions(+), 36 deletions(-) (limited to 'vcl/ios/iosinst.cxx') diff --git a/vcl/ios/iosinst.cxx b/vcl/ios/iosinst.cxx index 444d1acea47c..4767c46e3e12 100644 --- a/vcl/ios/iosinst.cxx +++ b/vcl/ios/iosinst.cxx @@ -107,8 +107,6 @@ IosSalInstance::IosSalInstance( SalYieldMutex *pMutex ) rc = pthread_mutex_init( &m_aRenderMutex, NULL ); SAL_WARN_IF( rc != 0, "vcl.ios", "pthread_mutex_init failed: " << strerror( rc ) ); #endif - - m_aRenderWindowsState.state = IDLE; } IosSalInstance::~IosSalInstance() @@ -281,7 +279,7 @@ void lo_set_view_size(int width, int height) viewHeight = height; } -IMPL_LINK_NOARG( IosSalInstance, RenderWindows ) +IMPL_LINK( IosSalInstance, RenderWindows, RenderWindowsArg*, arg ) { int rc; @@ -292,19 +290,6 @@ IMPL_LINK_NOARG( IosSalInstance, RenderWindows ) NSLog(@"RenderWindows: mutex locked"); - m_aRenderWindowsState.state = WAITING; - - /* We need to poke the UI thread to do drawRect() which calls - * lo_render_windows() which signals the condition so we can - * continue. - */ - lo_damaged( m_aRenderWindowsState.rect ); - - while (m_aRenderWindowsState.state != GOAHEAD) { - rc = pthread_cond_wait( &m_aRenderCond, &m_aRenderMutex ); - SAL_WARN_IF( rc != 0, "vcl.ios", "pthread_cond_wait failed: " << strerror( rc ) ); - } - NSDate *a = [NSDate date]; for( std::list< SalFrame* >::const_iterator it = getFrames().begin(); @@ -314,7 +299,7 @@ IMPL_LINK_NOARG( IosSalInstance, RenderWindows ) SalFrameGeometry aGeom = pFrame->GetGeometry(); CGRect bbox = CGRectMake( aGeom.nX, aGeom.nY, aGeom.nWidth, aGeom.nHeight ); if ( pFrame->IsVisible() && - CGRectIntersectsRect( m_aRenderWindowsState.rect, bbox ) ) { + CGRectIntersectsRect( arg->rect, bbox ) ) { const basebmp::BitmapDeviceSharedPtr aDevice = pFrame->getDevice(); CGDataProviderRef provider = @@ -331,11 +316,11 @@ IMPL_LINK_NOARG( IosSalInstance, RenderWindows ) NULL, false, kCGRenderingIntentDefault ); - CGContextDrawImage( m_aRenderWindowsState.context, bbox, image ); + CGContextDrawImage( arg->context, bbox, image ); } } - m_aRenderWindowsState.state = IDLE; + arg->done = true; rc = pthread_cond_signal( &m_aRenderCond ); SAL_WARN_IF( rc != 0, "vcl.ios", "pthread_cond_signal failed:" << strerror( rc ) ); @@ -369,25 +354,16 @@ void lo_render_windows( CGContextRef context, CGRect rect ) NSLog(@"lo_render_windows: mutex locked"); - if (pInstance->m_aRenderWindowsState.state == IosSalInstance::IDLE) { - pInstance->m_aRenderWindowsState.state = IosSalInstance::PENDING; - pInstance->m_aRenderWindowsState.context = context; - pInstance->m_aRenderWindowsState.rect = rect; - Application::PostUserEvent( LINK( pInstance, IosSalInstance, RenderWindows ) ); - } else { - pInstance->m_aRenderWindowsState.context = context; - pInstance->m_aRenderWindowsState.rect = CGRectUnion( pInstance->m_aRenderWindowsState.rect, rect ); - if (pInstance->m_aRenderWindowsState.state == IosSalInstance::WAITING) { - pInstance->m_aRenderWindowsState.state = IosSalInstance::GOAHEAD; - pthread_cond_signal( &pInstance->m_aRenderCond ); - while (pInstance->m_aRenderWindowsState.state != IosSalInstance::IDLE) { - rc = pthread_cond_wait( &pInstance->m_aRenderCond, &pInstance->m_aRenderMutex ); - SAL_WARN_IF( rc != 0, "vcl.ios", "pthread_cond_wait failed: " << strerror( rc ) ); - } - } + IosSalInstance::RenderWindowsArg arg = { false, context, rect }; + Application::PostUserEvent( LINK( pInstance, IosSalInstance, RenderWindows), &arg ); + + while (!arg.done) { + rc = pthread_cond_wait( &pInstance->m_aRenderCond, &pInstance->m_aRenderMutex ); + SAL_WARN_IF( rc != 0, "vcl.ios", "pthread_cond_wait failed: " << strerror( rc ) ); } - NSLog(@"lo_render_windows: unlocking mutex"); + NSLog(@"lo_render_windows: mutex unlocked"); + rc = pthread_mutex_unlock( &pInstance->m_aRenderMutex ); SAL_WARN_IF( rc != 0, "vcl.ios", "pthread_mutex_unlock failed: " << strerror( rc ) ); -- cgit