[EFL] Stop using smart pointers for Ecore_Timer
authorch.dumez@sisa.samsung.com <ch.dumez@sisa.samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 11 Feb 2013 12:44:34 +0000 (12:44 +0000)
committerch.dumez@sisa.samsung.com <ch.dumez@sisa.samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 11 Feb 2013 12:44:34 +0000 (12:44 +0000)
https://bugs.webkit.org/show_bug.cgi?id=109409

Reviewed by Kenneth Rohde Christiansen.

Source/WebCore:

Stop using a smart pointer for Ecore_Timer in RunLoop::TimerBase. This
is a bad idea because the timer handle becomes invalid as soon as the
timer callback returns ECORE_CALLBACK_CANCEL. This may lead to crashes
on destruction because OwnPtr calls ecore_timer_del() on an invalid
handle.

No new tests, already covered by exiting tests.

* platform/RunLoop.h:
(TimerBase):
* platform/efl/RunLoopEfl.cpp:
(WebCore::RunLoop::TimerBase::timerFired):
(WebCore::RunLoop::TimerBase::start):
(WebCore::RunLoop::TimerBase::stop):

Source/WTF:

Remove support in OwnPtr for EFL's Ecore_Timer. It is a bad idea to use
OwnPtr for Ecore_Timer because the timer handle may become invalid.

* wtf/OwnPtrCommon.h:
(WTF):
* wtf/efl/OwnPtrEfl.cpp:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@142454 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WTF/ChangeLog
Source/WTF/wtf/OwnPtrCommon.h
Source/WTF/wtf/efl/OwnPtrEfl.cpp
Source/WebCore/ChangeLog
Source/WebCore/platform/RunLoop.h
Source/WebCore/platform/efl/RunLoopEfl.cpp

index ac30121..7d758cd 100644 (file)
@@ -1,3 +1,17 @@
+2013-02-11  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
+        [EFL] Stop using smart pointers for Ecore_Timer
+        https://bugs.webkit.org/show_bug.cgi?id=109409
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Remove support in OwnPtr for EFL's Ecore_Timer. It is a bad idea to use
+        OwnPtr for Ecore_Timer because the timer handle may become invalid.
+
+        * wtf/OwnPtrCommon.h:
+        (WTF):
+        * wtf/efl/OwnPtrEfl.cpp:
+
 2013-02-11  Abhishek Arya  <inferno@chromium.org>
 
         Add ASSERT_WITH_SECURITY_IMPLICATION to detect out of bounds access
index 27c7754..9ac613f 100644 (file)
@@ -45,10 +45,8 @@ typedef struct _Ecore_Pipe Ecore_Pipe;
 typedef struct _Eina_Hash Eina_Hash;
 typedef struct _Eina_Module Eina_Module;
 #if USE(EO)
-typedef struct _Eo Ecore_Timer;
 typedef struct _Eo Evas_Object;
 #else
-typedef struct _Ecore_Timer Ecore_Timer;
 typedef struct _Evas_Object Evas_Object;
 #endif
 #if USE(ACCELERATED_COMPOSITING)
@@ -79,7 +77,6 @@ namespace WTF {
     WTF_EXPORT_PRIVATE void deleteOwnedPtr(Ecore_Evas*);
     WTF_EXPORT_PRIVATE void deleteOwnedPtr(Ecore_IMF_Context*);
     WTF_EXPORT_PRIVATE void deleteOwnedPtr(Ecore_Pipe*);
-    WTF_EXPORT_PRIVATE void deleteOwnedPtr(Ecore_Timer*);
     WTF_EXPORT_PRIVATE void deleteOwnedPtr(Eina_Hash*);
     WTF_EXPORT_PRIVATE void deleteOwnedPtr(Eina_Module*);
     WTF_EXPORT_PRIVATE void deleteOwnedPtr(Evas_Object*);
index 59c8ad5..4b289f8 100644 (file)
@@ -63,12 +63,6 @@ void deleteOwnedPtr(Eina_Module* ptr)
         eina_module_free(ptr); // If module wasn't unloaded, eina_module_free() calls eina_module_unload().
 }
 
-void deleteOwnedPtr(Ecore_Timer* ptr)
-{
-    if (ptr)
-        ecore_timer_del(ptr);
-}
-
 void deleteOwnedPtr(Ecore_IMF_Context* ptr)
 {
     if (ptr)
index 80ffadd..4ef596a 100644 (file)
@@ -1,3 +1,25 @@
+2013-02-11  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
+        [EFL] Stop using smart pointers for Ecore_Timer
+        https://bugs.webkit.org/show_bug.cgi?id=109409
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Stop using a smart pointer for Ecore_Timer in RunLoop::TimerBase. This
+        is a bad idea because the timer handle becomes invalid as soon as the
+        timer callback returns ECORE_CALLBACK_CANCEL. This may lead to crashes
+        on destruction because OwnPtr calls ecore_timer_del() on an invalid
+        handle.
+
+        No new tests, already covered by exiting tests.
+
+        * platform/RunLoop.h:
+        (TimerBase):
+        * platform/efl/RunLoopEfl.cpp:
+        (WebCore::RunLoop::TimerBase::timerFired):
+        (WebCore::RunLoop::TimerBase::start):
+        (WebCore::RunLoop::TimerBase::stop):
+
 2013-02-11  Vladislav Kaznacheev  <kaznacheev@chromium.org>
 
         Web Inspector: Allow SplitView to keep the sidebar size as a fraction of the container size
index f9ff551..b3ed576 100644 (file)
@@ -105,7 +105,7 @@ public:
         gboolean m_isRepeating;
 #elif PLATFORM(EFL)
         static bool timerFired(void* data);
-        OwnPtr<Ecore_Timer> m_timer;
+        Ecore_Timer* m_timer;
         bool m_isRepeating;
 #endif
     };
index 333e24e..a381b36 100644 (file)
@@ -86,7 +86,8 @@ void RunLoop::wakeUp()
 }
 
 RunLoop::TimerBase::TimerBase(RunLoop*)
-    : m_isRepeating(false)
+    : m_timer(0)
+    , m_isRepeating(false)
 {
 }
 
@@ -102,7 +103,7 @@ bool RunLoop::TimerBase::timerFired(void* data)
     timer->fired();
 
     if (!timer->m_isRepeating) {
-        timer->m_timer = nullptr;
+        timer->m_timer = 0;
         return ECORE_CALLBACK_CANCEL;
     }
 
@@ -111,13 +112,20 @@ bool RunLoop::TimerBase::timerFired(void* data)
 
 void RunLoop::TimerBase::start(double nextFireInterval, bool repeat)
 {
+    if (isActive())
+        stop();
+
     m_isRepeating = repeat;
-    m_timer = adoptPtr(ecore_timer_add(nextFireInterval, reinterpret_cast<Ecore_Task_Cb>(timerFired), this));
+    ASSERT(!m_timer);
+    m_timer = ecore_timer_add(nextFireInterval, reinterpret_cast<Ecore_Task_Cb>(timerFired), this);
 }
 
 void RunLoop::TimerBase::stop()
 {
-    m_timer = nullptr;
+    if (m_timer) {
+        ecore_timer_del(m_timer);
+        m_timer = 0;
+    }
 }
 
 bool RunLoop::TimerBase::isActive() const