]> git.sesse.net Git - vlc/commitdiff
* better implementation of timers for X11 skins
authorCyril Deguet <asmax@videolan.org>
Sun, 8 Jun 2003 11:33:14 +0000 (11:33 +0000)
committerCyril Deguet <asmax@videolan.org>
Sun, 8 Jun 2003 11:33:14 +0000 (11:33 +0000)
modules/gui/skins/x11/x11_run.cpp
modules/gui/skins/x11/x11_timer.cpp
modules/gui/skins/x11/x11_timer.h
modules/gui/skins/x11/x11_window.cpp

index 38386043bbadeef1c977137b6092b70d511e1607..6c73f0aec71702149ba335ec9ea01384baa17568 100644 (file)
@@ -2,7 +2,7 @@
  * x11_run.cpp:
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: x11_run.cpp,v 1.18 2003/06/08 00:32:07 asmax Exp $
+ * $Id: x11_run.cpp,v 1.19 2003/06/08 11:33:14 asmax Exp $
  *
  * Authors: Cyril Deguet     <asmax@videolan.org>
  *
@@ -168,7 +168,7 @@ void OSRun( intf_thread_t *p_intf )
 
 
     // Timer for SkinManage
-    X11Timer *refreshTimer = new X11Timer( p_intf, 100, RefreshCallback,
+    X11Timer *refreshTimer = new X11Timer( p_intf, 100000, RefreshCallback,
                                            (void*)p_intf );
     X11TimerManager *timerManager = X11TimerManager::Instance( p_intf );
     timerManager->addTimer( refreshTimer );
index 06b0c5892a3e2c20cdcabe96e74a300f87deb855..a391f501effe841a06e795ccbdb0c520d5a03f3c 100644 (file)
@@ -2,7 +2,7 @@
  * x11_timer.cpp: helper class to implement timers
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: x11_timer.cpp,v 1.2 2003/06/07 12:19:23 asmax Exp $
+ * $Id: x11_timer.cpp,v 1.3 2003/06/08 11:33:14 asmax Exp $
  *
  * Authors: Cyril Deguet     <asmax@videolan.org>
  *
@@ -41,22 +41,32 @@ X11Timer::X11Timer( intf_thread_t *p_intf, mtime_t interval, callback_t func,
     _interval = interval;
     _callback = func;
     _data = data;
+    _nextDate = 0;
+    vlc_mutex_init( p_intf, &_lock );
 }
 
 
 X11Timer::~X11Timer()
 {
+    vlc_mutex_destroy( &_lock );
 }
 
 
-mtime_t X11Timer::getNextDate( mtime_t current )
+void X11Timer::SetDate( mtime_t date )
 {
-    return (current / _interval + 1) * _interval;
+    _nextDate = date + _interval;
+}
+
+
+mtime_t X11Timer::GetNextDate()
+{
+    return _nextDate;
 }
 
 
 bool X11Timer::Execute()
 {
+    _nextDate += _interval;
     return (*_callback)( _data );
 }
 
@@ -70,6 +80,8 @@ X11TimerManager::X11TimerManager( intf_thread_t *p_intf )
 {
     _p_intf = p_intf;
     
+    vlc_mutex_init( p_intf, &_lock );
+    
     // Create the timer thread
     _p_timer = (timer_thread_t*)vlc_object_create( _p_intf,
                                                    sizeof( timer_thread_t ) );
@@ -81,6 +93,8 @@ X11TimerManager::~X11TimerManager()
 {
     _p_timer->die = 1;
     vlc_thread_join( _p_timer );
+
+    vlc_mutex_destroy( &_lock );
 }
 
 
@@ -115,19 +129,67 @@ void *X11TimerManager::Thread( void *p_timer )
 
     while( !((timer_thread_t*)p_timer)->die )
     {
-        list<X11Timer*>::iterator timer;
-        // FIXME temporary
-        for( timer = _instance->_timers.begin(); 
-             timer != _instance->_timers.end(); timer++ )
+        _instance->WaitNextTimer();
+    }
+}
+
+
+void X11TimerManager::WaitNextTimer()
+{
+    mtime_t curDate = mdate();
+    mtime_t nextDate = LAST_MDATE;
+
+    X11Timer *nextTimer = NULL;
+    Lock();       
+    // Find the next timer to execute
+    list<X11Timer*>::iterator timer;
+    for( timer = _timers.begin(); timer != _timers.end(); timer++ )
+    {
+        mtime_t timerDate = (*timer)->GetNextDate();
+        if( timerDate < nextDate )
+        {
+            nextTimer = *timer;
+            nextDate = timerDate;
+        }
+    }
+    Unlock();
+    
+    if( nextTimer == NULL )
+    {
+        // FIXME: should wait on a cond instead
+        msleep( 10000 );
+    }
+    else
+    {
+        if( nextDate > curDate )
         {
-            bool ret = (*timer)->Execute();
-            if( !ret ) 
-            {   _instance->_timers.remove( *timer );
-                break;
-            }
+            mwait( nextDate );
+        }
+        bool ret = nextTimer->Execute();
+        if( !ret ) 
+        {   
+            _timers.remove( nextTimer );
         }
-        msleep( 100000 );
     }
 }
 
+
+void X11TimerManager::addTimer( X11Timer *timer )
+{ 
+   timer->SetDate( mdate() );
+    _timers.push_back( timer ); 
+}
+
+
+void X11TimerManager::removeTimer( X11Timer *timer ) 
+{
+    Lock();
+    timer->Lock();
+    _timers.remove( timer ); 
+    Unlock();
+    timer->Unlock();
+}
+
+
 #endif
index ea181c9942005f8516b89b2c5c239cbe2f7c2ae8..6a6ae0f561b109d5c9dfc8d5d21fd6cbce990e9e 100644 (file)
@@ -2,7 +2,7 @@
  * x11_timer.h: helper class to implement timers
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: x11_timer.h,v 1.2 2003/06/07 12:19:23 asmax Exp $
+ * $Id: x11_timer.h,v 1.3 2003/06/08 11:33:14 asmax Exp $
  *
  * Authors: Cyril Deguet     <asmax@videolan.org>
  *
@@ -46,14 +46,20 @@ class X11Timer
         mtime_t _interval;       
         callback_t _callback;
         void *_data;
+        vlc_mutex_t _lock;
+        mtime_t _nextDate;
 
     public:
         X11Timer( intf_thread_t *p_intf, mtime_t interval, callback_t func, 
                   void *data );
         ~X11Timer();
 
-        mtime_t getNextDate( mtime_t current );
+        void SetDate( mtime_t date );
+        mtime_t GetNextDate();
         bool Execute();
+        
+        inline void Lock() { vlc_mutex_lock( &_lock ); }
+        inline void Unlock() { vlc_mutex_unlock( &_lock ); }
 };
 //---------------------------------------------------------------------------
 class X11TimerManager
@@ -63,19 +69,23 @@ class X11TimerManager
         intf_thread_t *_p_intf;
         timer_thread_t *_p_timer;
         list<X11Timer*> _timers;
+        vlc_mutex_t _lock;
         
         X11TimerManager( intf_thread_t *p_intf );
         ~X11TimerManager();
 
         static void *Thread( void *p_timer );
+        void WaitNextTimer();
 
     public:
         static X11TimerManager *Instance( intf_thread_t *p_intf );
         void Destroy();
 
-        void addTimer( X11Timer *timer ) { _timers.push_back( timer ); }
-        void removeTimer( X11Timer *timer ) { _timers.remove( timer ); }
+        void addTimer( X11Timer *timer );
+        void removeTimer( X11Timer *timer );
 
+        inline void Lock() { vlc_mutex_lock( &_lock ); }
+        inline void Unlock() { vlc_mutex_unlock( &_lock ); }
 };
 //---------------------------------------------------------------------------
 #endif
index 5c6e1f18797b24d5ea3f1d4e5bb9c454ad4279b9..b5b21586600b316b645872474fe30d2cacceac6f 100644 (file)
@@ -2,7 +2,7 @@
  * x11_window.cpp: X11 implementation of the Window class
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: x11_window.cpp,v 1.13 2003/06/08 00:32:07 asmax Exp $
+ * $Id: x11_window.cpp,v 1.14 2003/06/08 11:33:14 asmax Exp $
  *
  * Authors: Cyril Deguet     <asmax@videolan.org>
  *
@@ -116,7 +116,7 @@ X11Window::X11Window( intf_thread_t *p_intf, Window wnd, int x, int y,
     XUNLOCK;
 
     ToolTip.display = display;
-    X11Timer *timer = new X11Timer( p_intf, 100, ToolTipCallback, &ToolTip );
+    X11Timer *timer = new X11Timer( p_intf, 500000, ToolTipCallback, &ToolTip );
     ToolTip.p_intf = p_intf;
     ToolTip.timer = timer;