X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=base%2Fdali-toolkit%2Finternal%2Fcontrols%2Frelayout-controller.cpp;h=1a3a4e61faf1e7c12fe244598a4649e0ff2d610d;hb=be0d47169c97f0a3100834d0c129032bdefce9c6;hp=784ffbdf77df24f92c6cc441467fa7d5f59bb2da;hpb=a881757839b7abb008873a68c67e17b3ba39669b;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/base/dali-toolkit/internal/controls/relayout-controller.cpp b/base/dali-toolkit/internal/controls/relayout-controller.cpp index 784ffbd..1a3a4e6 100644 --- a/base/dali-toolkit/internal/controls/relayout-controller.cpp +++ b/base/dali-toolkit/internal/controls/relayout-controller.cpp @@ -22,7 +22,6 @@ // EXTERNAL INCLUDES -#include #include #include #include @@ -42,6 +41,14 @@ namespace Toolkit namespace Internal { +namespace +{ +// Flag to avoid doing more than one request per frame +// getting the singleton handle can be expensive as it requires calling to adaptor, dynamic cast etc +// and it can get called 100 times per frame easily in startup and new view initialization + bool gRelayoutRequestPending = false; +} + RelayoutController::RelayoutController() { @@ -52,28 +59,36 @@ RelayoutController::~RelayoutController() } -RelayoutController RelayoutController::Get() +void RelayoutController::Request() { - RelayoutController controller; - - // Check whether the RelayoutController is already created - Dali::Adaptor& adaptor = Dali::Adaptor::Get(); - Dali::BaseHandle handle = adaptor.GetSingleton(typeid(RelayoutController)); - - if(handle) + // are we already going to do it this frame + if( !gRelayoutRequestPending ) { - // If so, downcast the handle of singleton to RelayoutController - controller = RelayoutController(dynamic_cast(handle.GetObjectPtr())); + RelayoutController controller; + + // Check whether the RelayoutController is already created + SingletonService singletonService( SingletonService::Get() ); + if ( singletonService ) + { + Dali::BaseHandle handle = singletonService.GetSingleton(typeid(RelayoutController)); + + if(handle) + { + // If so, downcast the handle of singleton to RelayoutController + controller = RelayoutController(dynamic_cast(handle.GetObjectPtr())); + } + + if(!controller) + { + // If not, create the RelayoutController and register it as a singleton + controller = RelayoutController( new Internal::RelayoutControllerImpl(gRelayoutRequestPending) ); + singletonService.Register( typeid(controller), controller ); + } + + GetImpl(controller).Request(); + gRelayoutRequestPending = true; + } } - - if(!controller) - { - // If not, create the RelayoutController and register it as a singleton - controller = RelayoutController(new Internal::RelayoutControllerImpl()); - adaptor.RegisterSingleton(typeid(controller), controller); - } - - return controller; } RelayoutController::RelayoutController(Internal::RelayoutControllerImpl *impl) @@ -81,12 +96,6 @@ RelayoutController::RelayoutController(Internal::RelayoutControllerImpl *impl) { } -void RelayoutController::Request() -{ - GetImpl(*this).Request(); -} - - } // namespace Internal } // namespace Toolkit