Changeset 3718

Show
Ignore:
Timestamp:
02/21/06 23:36:15 (3 years ago)
Author:
morris
Message:

Some more timer fixes

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • libwired/trunk/libwired/thread/wi-timer.c

    r3657 r3718  
    4242#include <wired/wi-timer.h> 
    4343 
    44 #define _WI_TIMER_EPSILON                               0.1 
     44#define _WI_TIMER_EPSILON                               0.2 
    4545 
    4646 
     
    110110 
    111111static void _wi_timers_thread(wi_runtime_instance_t *argument) { 
    112         wi_timer_t                      *timer
     112        wi_timer_t                      *timer, *fire_timer
    113113        wi_time_interval_t      interval, diff; 
     114        wi_boolean_t            locked; 
    114115 
    115116        while(true) { 
    116                 timer = wi_list_first_data(_wi_timers); 
    117                 interval = wi_time_interval(); 
     117                fire_timer      = NULL; 
     118                locked          = true; 
     119                timer           = wi_list_first_data(_wi_timers); 
     120                interval        = wi_time_interval(); 
    118121 
    119122                if(!timer) { 
     
    122125                        timer = wi_list_first_data(_wi_timers); 
    123126                        interval = wi_time_interval(); 
     127 
     128                        if(timer && timer->fire - interval <= _WI_TIMER_EPSILON) 
     129                                fire_timer = timer; 
    124130                } else { 
    125131                        diff = timer->fire - interval; 
    126132 
    127                         if(diff > _WI_TIMER_EPSILON) { 
    128                                 wi_condition_lock_lock_when_condition(_wi_timers_lock, 1, diff); 
    129                  
    130                                 interval = wi_time_interval(); 
    131  
    132                                 timer = wi_list_first_data(_wi_timers); 
    133                         } 
     133                        if(diff <= _WI_TIMER_EPSILON) { 
     134                                fire_timer = timer; 
     135 
     136                                locked = false; 
     137                        } else { 
     138                                if(!wi_condition_lock_lock_when_condition(_wi_timers_lock, 1, diff)) 
     139                                        fire_timer = wi_list_first_data(_wi_timers); 
     140                        }  
    134141                } 
    135142 
    136                 if(timer && timer->fire <= interval) { 
    137                         _wi_timer_invalidate(timer); 
     143                if(fire_timer) { 
     144                        _wi_timer_invalidate(fire_timer); 
    138145                                 
    139                         wi_timer_fire(timer); 
     146                        wi_timer_fire(fire_timer); 
    140147 
    141148                        if(timer->repeats) 
    142                                 _wi_timer_schedule(timer); 
     149                                _wi_timer_schedule(fire_timer); 
    143150                } 
    144151 
    145                 wi_condition_lock_unlock_with_condition(_wi_timers_lock, 0); 
     152                if(locked) 
     153                        wi_condition_lock_unlock_with_condition(_wi_timers_lock, 0); 
    146154        } 
    147155}