]> git.sesse.net Git - vlc/commitdiff
Qt: eventratelimiter: use mutex
authorFrancois Cartegnie <fcvlcdev@free.fr>
Wed, 22 Aug 2012 19:55:36 +0000 (21:55 +0200)
committerFrancois Cartegnie <fcvlcdev@free.fr>
Thu, 23 Aug 2012 16:58:18 +0000 (18:58 +0200)
modules/gui/qt4/util/uniqueevent.cpp
modules/gui/qt4/util/uniqueevent.hpp

index e116bb3eaf8a822759d42cc55c4f43157e2cf735..7dade60eddd99c6e5bb7ab0d3f388875df7d7b4e 100644 (file)
 
 #include <QTimer>
 #include <QApplication>
+#include <QMutex>
 
 RateLimitedEventPoster::RateLimitedEventPoster( int i_millisec_interval )
 {
     timer = new QTimer();
+    mutex = new QMutex();
     timer->setSingleShot( true );
     /* Assuming a 24fps event loop, delays at least events to the next frame */
     if ( i_millisec_interval < 1 )
@@ -38,28 +40,39 @@ RateLimitedEventPoster::~RateLimitedEventPoster()
     timer->stop();
     commit();
     delete timer;
+    delete mutex;
 }
 
 void RateLimitedEventPoster::postEvent( UniqueEvent *e, QObject *target )
 {
     event_tuple newtuple = { target, e };
-    foreach( event_tuple tuple, eventsList )
+    mutex->lock();
+    foreach( const event_tuple & tuple, eventsList )
     {
         if ( target == tuple.target && tuple.event->equals( e ) )
         {
             delete e;
+            mutex->unlock();
             return;
         }
     }
     eventsList << newtuple;
+    mutex->unlock();
+    if ( eventsList.count() >= 100 ) /* limit lookup time */
+    {
+        timer->stop();
+        commit();
+    }
     if ( !timer->isActive() ) timer->start();
 }
 
 void RateLimitedEventPoster::commit()
 {
-    foreach( event_tuple tuple, eventsList )
+    mutex->lock();
+    foreach( const event_tuple & tuple, eventsList )
     {
         QApplication::postEvent( tuple.target, tuple.event );
     }
     eventsList.clear();
+    mutex->unlock();
 }
index 0eb2bd3ea5b2fc6676ecfd1475947764148699dc..50654414d2fb904714c18e4cf818cb78de2fd70c 100644 (file)
@@ -22,6 +22,7 @@
 #include <QEvent>
 #include <QList>
 class QTimer;
+class QMutex;
 
 class UniqueEvent : public QEvent
 {
@@ -50,6 +51,7 @@ private:
     };
     QList<event_tuple> eventsList;
     QTimer *timer;
+    QMutex *mutex;
 };
 
 #endif // UNIQUEEVENT_HPP