Changeset 5695:dd52b51afdfb in roaraudio


Ignore:
Timestamp:
10/13/12 23:28:54 (12 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

support diffrent strategy values.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/scheduler.c

    r5694 r5695  
    164164} 
    165165 
     166static int __run_waits(struct roar_scheduler * sched) { 
     167 struct roar_scheduler_source * cur; 
     168 size_t i; 
     169 int ret = -1; 
     170 
     171 for (i = 0; ret == -1 && i < sched->sources_len; i++) { 
     172  if ( (cur = sched->sources[i]) == NULL ) 
     173   continue; 
     174  switch (cur->type) { 
     175   case ROAR_SCHEDULER_PLUGIN: 
     176     ret = roar_dl_appsched_trigger(cur->lhandle, ROAR_DL_APPSCHED_WAIT); 
     177    break; 
     178   case ROAR_SCHEDULER_PLUGINCONTAINER: 
     179     ret = roar_plugincontainer_appsched_trigger(cur->handle.container, ROAR_DL_APPSCHED_WAIT); 
     180    break; 
     181#ifndef DEBUG 
     182   default: /* noop */ break; 
     183#endif 
     184  } 
     185 } 
     186 
     187 return ret; 
     188} 
     189 
    166190// what to do?: 
    167191// 0. get all VIOs. 
     
    171195// 4. send UPDATE to all plugins and containers. 
    172196int                     roar_scheduler_iterate(struct roar_scheduler * sched) { 
     197 enum roar_scheduler_strategy strategy; 
    173198 struct roar_vio_selecttv timeout = {8, 0}; // default: 8 sec. Just a random value. 
    174199 struct roar_scheduler_source * cur, * new_client; 
     
    178203 size_t i; 
    179204 int have_timeout = 0; 
    180  size_t todo = 0; 
     205 size_t todo = 0, vios = 0; 
    181206 int tmp; 
    182207 
    183208 _CHKSCHED(0); 
     209 
     210 strategy = sched->strategy; 
     211 if ( strategy == ROAR_SCHEDULER_STRATEGY_DEFAULT ) 
     212  strategy = ROAR_SCHEDULER_STRATEGY_SELECTORWAIT; 
    184213 
    185214 if ( sched->vios == NULL || sched->vios_len < sched->sources_len ) { 
     
    210239     ROAR_VIO_SELECT_SETVIO(&(sched->vios[i]), cur->vio, cur->handle.eventsq); 
    211240     todo++; 
     241     vios++; 
    212242    break; 
    213243   case ROAR_SCHEDULER_TIMEOUT: 
     
    219249     ROAR_VIO_SELECT_SETVIO(&(sched->vios[i]), cur->vio, ROAR_VIO_SELECT_READ); 
    220250     todo++; 
     251     vios++; 
    221252    break; 
    222253   case ROAR_SCHEDULER_CPI_CLIENT: 
     
    244275     ROAR_VIO_SELECT_SETVIO(&(sched->vios[i]), sched->sources[i]->vio, tmp); 
    245276     todo++; 
     277     vios++; 
    246278    break; 
    247279   case ROAR_SCHEDULER_PLUGIN: 
     
    260292 } 
    261293 
    262  ret = roar_vio_select(sched->vios, sched->vios_len, &timeout, NULL); 
     294 if ( strategy == ROAR_SCHEDULER_STRATEGY_WAITORSELECT || strategy == ROAR_SCHEDULER_STRATEGY_WAIT ) { 
     295  ret = __run_waits(sched); 
     296  if ( ret == 0 || strategy == ROAR_SCHEDULER_STRATEGY_WAIT ) 
     297   ret = 1; 
     298 } else { 
     299  ret = -1; 
     300 } 
     301 
     302 if ( ret == -1 && !(strategy == ROAR_SCHEDULER_STRATEGY_SELECTORWAIT && vios == 0) ) { 
     303  ret = roar_vio_select(sched->vios, sched->vios_len, &timeout, NULL); 
     304 } 
     305 
     306 if ( ret < 0 && strategy == ROAR_SCHEDULER_STRATEGY_SELECTORWAIT ) { 
     307  ret = __run_waits(sched); 
     308  if ( ret == 0 ) 
     309   ret = 1; 
     310 } 
     311 
    263312 if ( ret == -1 ) 
    264313  return -1; 
Note: See TracChangeset for help on using the changeset viewer.