vcl/source/bitmap/bitmapscalesuper.cxx | 59 ++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 23 deletions(-)
New commits: commit 29108b656576d66e336b4bbe623556b4a82fef81 Author: Caolán McNamara <[email protected]> Date: Sun Feb 26 21:10:38 2017 +0000 fall back to unthreaded scaling if threaded scaling fails Change-Id: I916bdca4976bcc39d4342dacc9d0aea9a711e1f1 Reviewed-on: https://gerrit.libreoffice.org/34660 Tested-by: Jenkins <[email protected]> Reviewed-by: Caolán McNamara <[email protected]> Tested-by: Caolán McNamara <[email protected]> diff --git a/vcl/source/bitmap/bitmapscalesuper.cxx b/vcl/source/bitmap/bitmapscalesuper.cxx index ae540e5..15aa67e 100644 --- a/vcl/source/bitmap/bitmapscalesuper.cxx +++ b/vcl/source/bitmap/bitmapscalesuper.cxx @@ -989,43 +989,56 @@ bool BitmapScaleSuper::filter(Bitmap& rBitmap) // We work hard when there is a large destination image, or // A large source image. bool bHorizontalWork = pReadAccess->Width() > 512 || pWriteAccess->Width() > 512; + bool bUseThreads = true; static bool bDisableThreadedScaling = getenv ("VCL_NO_THREAD_SCALE"); if ( bDisableThreadedScaling || !bHorizontalWork || nEndY - nStartY < SCALE_THREAD_STRIP ) { SAL_INFO("vcl.gdi", "Scale in main thread"); - pScaleRangeFn( aContext, nStartY, nEndY ); + bUseThreads = false; } - else + + if (bUseThreads) { - // partition and queue work - comphelper::ThreadPool &rShared = comphelper::ThreadPool::getSharedOptimalPool(); - std::shared_ptr<comphelper::ThreadTaskTag> pTag = comphelper::ThreadPool::createThreadTaskTag(); - sal_uInt32 nThreads = rShared.getWorkerCount(); - assert( nThreads > 0 ); - sal_uInt32 nStrips = ((nEndY - nStartY) + SCALE_THREAD_STRIP - 1) / SCALE_THREAD_STRIP; - sal_uInt32 nStripsPerThread = nStrips / nThreads; - SAL_INFO("vcl.gdi", "Scale in " << nStrips << " strips " << nStripsPerThread << " per thread we have " << nThreads << " CPU threads "); - long nStripY = nStartY; - for ( sal_uInt32 t = 0; t < nThreads - 1; t++ ) + try { - ScaleTask *pTask = new ScaleTask( pTag, pScaleRangeFn ); - for ( sal_uInt32 j = 0; j < nStripsPerThread; j++ ) + // partition and queue work + comphelper::ThreadPool &rShared = comphelper::ThreadPool::getSharedOptimalPool(); + std::shared_ptr<comphelper::ThreadTaskTag> pTag = comphelper::ThreadPool::createThreadTaskTag(); + sal_uInt32 nThreads = rShared.getWorkerCount(); + assert( nThreads > 0 ); + sal_uInt32 nStrips = ((nEndY - nStartY) + SCALE_THREAD_STRIP - 1) / SCALE_THREAD_STRIP; + sal_uInt32 nStripsPerThread = nStrips / nThreads; + SAL_INFO("vcl.gdi", "Scale in " << nStrips << " strips " << nStripsPerThread << " per thread we have " << nThreads << " CPU threads "); + long nStripY = nStartY; + for ( sal_uInt32 t = 0; t < nThreads - 1; t++ ) { - ScaleRangeContext aRC( &aContext, nStripY ); - pTask->push( aRC ); - nStripY += SCALE_THREAD_STRIP; + ScaleTask *pTask = new ScaleTask( pTag, pScaleRangeFn ); + for ( sal_uInt32 j = 0; j < nStripsPerThread; j++ ) + { + ScaleRangeContext aRC( &aContext, nStripY ); + pTask->push( aRC ); + nStripY += SCALE_THREAD_STRIP; + } + rShared.pushTask( pTask ); } - rShared.pushTask( pTask ); - } - // finish any remaining bits here - pScaleRangeFn( aContext, nStripY, nEndY ); + // finish any remaining bits here + pScaleRangeFn( aContext, nStripY, nEndY ); - rShared.waitUntilDone(pTag); - SAL_INFO("vcl.gdi", "All threaded scaling tasks complete"); + rShared.waitUntilDone(pTag); + SAL_INFO("vcl.gdi", "All threaded scaling tasks complete"); + } + catch (...) + { + SAL_WARN("vcl.gdi", "threaded bitmap scaling failed"); + bUseThreads = false; + } } + if (!bUseThreads) + pScaleRangeFn( aContext, nStartY, nEndY ); + bRet = true; }
_______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
