Changeset 5302

Show
Ignore:
Timestamp:
02/22/08 10:55:25 (7 months ago)
Author:
morris
Message:

Execute timer outside of lock so the timer function can reschedule another timer

Files:

Legend:

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

    r4855 r5302  
    140140 
    141141                        if(timer && timer->fire - interval <= _WI_TIMER_EPSILON) 
    142                                 fire_timer = timer
     142                                fire_timer = wi_retain(timer)
    143143                } else { 
    144144                        diff = timer->fire - interval; 
    145145 
    146146                        if(diff <= _WI_TIMER_EPSILON) { 
    147                                 fire_timer = timer
     147                                fire_timer = wi_retain(timer)
    148148 
    149149                                locked = false; 
    150150                        } else { 
    151151                                if(!wi_condition_lock_lock_when_condition(_wi_timer_lock, 1, diff)) 
    152                                         fire_timer = wi_array_first_data(_wi_timers); 
     152                                        fire_timer = wi_retain(wi_array_first_data(_wi_timers)); 
    153153                        }  
    154154                } 
     155 
     156                if(locked) 
     157                        wi_condition_lock_unlock_with_condition(_wi_timer_lock, 0); 
    155158                 
    156159                if(fire_timer) { 
     
    161164                        if(timer->repeats) 
    162165                                _wi_timer_schedule(fire_timer); 
     166                         
     167                        wi_release(fire_timer); 
    163168                } 
    164  
    165                 if(locked) 
    166                         wi_condition_lock_unlock_with_condition(_wi_timer_lock, 0); 
    167169                 
    168170                if(++i % 100 == 0)