fix memory leak of Overlay Control
authorwoo <s-w.woo@samsung.com>
Thu, 24 Oct 2013 12:29:54 +0000 (21:29 +0900)
committerwoo <s-w.woo@samsung.com>
Thu, 24 Oct 2013 12:29:54 +0000 (21:29 +0900)
Change-Id: I74cba2dd578deb09785e26b99d36cb4ca7c7b304
Signed-off-by: woo <s-w.woo@samsung.com>
src/ui/controls/FUiCtrl_OverlayAgent.cpp

index 8007ad3..810c28d 100644 (file)
@@ -218,6 +218,15 @@ struct visualElementDeleter
        }
 };
 
+struct xVImageDeleter
+{
+       void operator()(XvImage* pXvImage)
+       {
+               XFree(pXvImage);
+               pXvImage = null;
+       }
+};
+
 _OverlayAgent::_OverlayVisualElement::_OverlayVisualElement(void)
        : __pOverlayTimer(null)
        , __pImageObject(null)
@@ -418,6 +427,7 @@ _OverlayAgent::~_OverlayAgent(void)
                XShmDetach((Display*)ecore_x_display_get(), __pShmInfo);
                shmdt(__pShmInfo->shmaddr);
                shmctl(__pShmInfo->shmid, IPC_RMID, NULL);
+               delete __pShmInfo;
                __pShmInfo = null;
        }
 
@@ -441,7 +451,6 @@ _OverlayAgent::~_OverlayAgent(void)
 
        if (__pRendererVE != null)
        {
-               __pRendererVE->SetSurface(null);
                __pRendererVE->Destroy();
                __pRendererVE = null;
        }
@@ -619,7 +628,7 @@ _OverlayAgent::UngrabXvPort(void)
        if (__xvPort > 0 && (__xvPort - __baseXvPort) >= 0 && __isPortGrabbed[__xvPort - __baseXvPort])
        {
                Display* pDisplay = (Display*) ecore_x_display_get();
-               Atom atom = XInternAtom(pDisplay, "_USER_WM_PORT_ATTRIBUTE_STREAM_OFF", False);
+               Atom atom = XInternAtom(pDisplay, "_USER_WM_PORT_ATTRIBUTE_STREAM_OFF", False);
                XvSetPortAttribute(pDisplay, __xvPort, atom, 1);
                XvUngrabPort(pDisplay, __xvPort, 0);
 
@@ -635,7 +644,7 @@ _OverlayAgent::PutXvImage(void)
 {
        SysTryReturnResult(NID_UI_CTRL, __pixmap != 0, E_SYSTEM, "The current value of pixmap is null");
 
-       Display* pDisplay = (Display*)ecore_x_display_get();
+       Display* pDisplay = (Display*) ecore_x_display_get();
        SysTryReturnResult(NID_UI_CTRL, pDisplay != null, E_SYSTEM, "The current value of Display is null");
 
        if (__pXvImage == null || __needToRellaocImage)
@@ -673,25 +682,19 @@ _OverlayAgent::PutXvImage(void)
 
        if (__needToRellaocImage)
        {
-               XShmSegmentInfo* pShmInfo = new (std::nothrow) XShmSegmentInfo();
+               unique_ptr<XShmSegmentInfo> pShmInfo(new (std::nothrow) XShmSegmentInfo());
                SysTryReturnResult(NID_UI_CTRL, pShmInfo != null, E_SYSTEM, "Failed to create XShmSegmentInfo");
 
-               XvImage* pXvImage = XvShmCreateImage(pDisplay, __xvPort, __savedColorFormat, 0, __currentSourceBufferSize.width, __currentSourceBufferSize.height, pShmInfo);
+               unique_ptr<XvImage, xVImageDeleter> pXvImage(XvShmCreateImage(pDisplay, __xvPort, __savedColorFormat, 0, __currentSourceBufferSize.width, __currentSourceBufferSize.height, pShmInfo.get()));
                SysTryReturnResult(NID_UI_CTRL, pXvImage != null, E_SYSTEM, "Failed to create XvImage");
 
                pShmInfo->shmid = shmget(IPC_PRIVATE, pXvImage->data_size, IPC_CREAT | 0777);
                pShmInfo->shmaddr = pXvImage->data = (char*)shmat(pShmInfo->shmid, 0, 0);
                pShmInfo->readOnly = False;
+               SysTryReturnResult(NID_UI_CTRL, XShmAttach(pDisplay, pShmInfo.get()), E_SYSTEM, "[E_SYSTEM] Failed to XShmAttach.");
 
-               if (!XShmAttach(pDisplay, pShmInfo))
-               {
-                       XFree(pXvImage);
-                       SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Failed to XShmAttach.");
-                       return E_SYSTEM;
-               }
-
-               __pXvImage = pXvImage;
-               __pShmInfo = pShmInfo;
+               __pShmInfo = pShmInfo.release();
+               __pXvImage = pXvImage.release();
        }
 
        if (__pXvImage == null)
@@ -1078,7 +1081,7 @@ _OverlayAgent::CreateRendererVisualElement(const _Control& parentControl, const
        unique_ptr<VisualElementSurface> pRendererSurface(_VisualElementSurfaceImpl::CreateSurfaceUsingExistingObjectN(*pDisplayContext, (Handle)__pImageObject, Dimension(physicalBounds.width, physicalBounds.height)));
        SysTryReturnResult(NID_UI_CTRL, pRendererSurface != null, E_SYSTEM, "[E_SYSTEM] The current value of RootWindow's DisplayContext is null.");
 
-       r = pRendererVE->SetSurface(pRendererSurface.release());
+       r = pRendererVE->SetSurface(pRendererSurface.get());
        SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
 
        r = pRendererVE->SetFlushNeeded();