From ed55cb5a228c7ca5544f41da8897420104764555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Sat, 23 Oct 2010 22:19:43 +0000 Subject: [PATCH] Cache the retrace semaphore. Use the right kind of locking in the method that needs it. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39096 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../app/drawing/AccelerantHWInterface.cpp | 25 ++++++++++--------- .../app/drawing/AccelerantHWInterface.h | 2 ++ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/servers/app/drawing/AccelerantHWInterface.cpp b/src/servers/app/drawing/AccelerantHWInterface.cpp index 57ee1d4329..d4ffb4a794 100644 --- a/src/servers/app/drawing/AccelerantHWInterface.cpp +++ b/src/servers/app/drawing/AccelerantHWInterface.cpp @@ -138,6 +138,8 @@ AccelerantHWInterface::AccelerantHWInterface() fInitialModeSwitch(true), + fRetraceSemaphore(-1), + fRectParams(new (nothrow) fill_rect_params[kDefaultParamsCount]), fRectParamsCount(kDefaultParamsCount), fBlitParams(new (nothrow) blit_params[kDefaultParamsCount]), @@ -1017,30 +1019,29 @@ AccelerantHWInterface::GetMonitorInfo(monitor_info* info) sem_id AccelerantHWInterface::RetraceSemaphore() { + AutoWriteLocker _(this); + + if (fRetraceSemaphore != -1) + return fRetraceSemaphore; + accelerant_retrace_semaphore AccelerantRetraceSemaphore = (accelerant_retrace_semaphore)fAccelerantHook( B_ACCELERANT_RETRACE_SEMAPHORE, NULL); if (!AccelerantRetraceSemaphore) - return B_UNSUPPORTED; + fRetraceSemaphore = B_UNSUPPORTED; + else + fRetraceSemaphore = AccelerantRetraceSemaphore(); - return AccelerantRetraceSemaphore(); + return fRetraceSemaphore; } status_t AccelerantHWInterface::WaitForRetrace(bigtime_t timeout) { - AutoReadLocker _(this); - - accelerant_retrace_semaphore AccelerantRetraceSemaphore - = (accelerant_retrace_semaphore)fAccelerantHook( - B_ACCELERANT_RETRACE_SEMAPHORE, NULL); - if (!AccelerantRetraceSemaphore) - return B_UNSUPPORTED; - - sem_id sem = AccelerantRetraceSemaphore(); + sem_id sem = RetraceSemaphore(); if (sem < 0) - return B_ERROR; + return sem; return acquire_sem_etc(sem, 1, B_RELATIVE_TIMEOUT, timeout); } diff --git a/src/servers/app/drawing/AccelerantHWInterface.h b/src/servers/app/drawing/AccelerantHWInterface.h index 02ed61a95c..fd81fd2782 100644 --- a/src/servers/app/drawing/AccelerantHWInterface.h +++ b/src/servers/app/drawing/AccelerantHWInterface.h @@ -177,6 +177,8 @@ private: display_mode fDisplayMode; bool fInitialModeSwitch; + sem_id fRetraceSemaphore; + mutable fill_rect_params* fRectParams; mutable uint32 fRectParamsCount; mutable blit_params* fBlitParams;