Changeset 624133c in rtems


Ignore:
Timestamp:
Jun 6, 1996, 2:53:12 PM (25 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
2f200c7
Parents:
ed10d76
Message:

added Sporadic Server support

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • c/src/exec/posix/src/pthread.c

    red10d76 r624133c  
    1717#include <rtems/posix/priority.h>
    1818#include <rtems/posix/config.h>
     19#include <rtems/posix/time.h>
    1920
    2021/*PAGE
     
    607608/*PAGE
    608609 *
     610 *  _POSIX_Threads_Sporadic_budget_TSR
     611 */
     612
     613void _POSIX_Threads_Sporadic_budget_TSR(
     614  Objects_Id      id,
     615  void           *argument
     616)
     617{
     618  Thread_Control     *the_thread;
     619  POSIX_API_Control  *api;
     620
     621  the_thread = argument;
     622
     623  api = the_thread->API_Extensions[ THREAD_API_POSIX ];
     624
     625  the_thread->cpu_time_budget =
     626    _POSIX_Timespec_to_interval( &api->schedparam.ss_initial_budget );
     627
     628  _Thread_Change_priority(
     629    the_thread,
     630    _POSIX_Priority_To_core( api->schedparam.sched_priority )
     631  );
     632 
     633  _Watchdog_Insert_ticks(
     634    &api->Sporadic_timer,
     635    _POSIX_Timespec_to_interval( &api->schedparam.ss_replenish_period )
     636  );
     637}
     638
     639/*PAGE
     640 *
     641 *  _POSIX_Threads_Sporadic_budget_callout
     642 */
     643
     644void _POSIX_Threads_Sporadic_budget_callout(
     645  Thread_Control *the_thread
     646)
     647{
     648  POSIX_API_Control                  *api;
     649
     650  /* XXX really should be based on MAX_U32 */
     651
     652  api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
     653
     654  the_thread->cpu_time_budget = 0xFFFFFFFF;
     655
     656  _Thread_Change_priority(
     657    the_thread,
     658    _POSIX_Priority_To_core( api->schedparam.ss_low_priority )
     659  );
     660}
     661
     662/*PAGE
     663 *
    609664 *  16.1.2 Thread Creation, P1003.1c/Draft 10, p. 144
    610665 */
     
    617672)
    618673{
    619   const pthread_attr_t  *the_attr;
    620   Priority_Control       core_priority;
    621   boolean                is_timesliced;
    622   boolean                is_fp;
    623   boolean                status;
    624   Thread_Control        *the_thread;
    625   char                  *default_name = "psx";
    626   POSIX_API_Control     *api;
    627   int                    schedpolicy = SCHED_RR;
    628   struct sched_param     schedparam;
     674  const pthread_attr_t               *the_attr;
     675  Priority_Control                    core_priority;
     676  Thread_CPU_budget_algorithms        budget_algorithm;
     677  Thread_CPU_budget_algorithm_callout budget_callout;
     678  boolean                             is_fp;
     679  boolean                             status;
     680  Thread_Control                     *the_thread;
     681  char                               *default_name = "psx";
     682  POSIX_API_Control                  *api;
     683  int                                 schedpolicy = SCHED_RR;
     684  struct sched_param                  schedparam;
    629685
    630686  the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
     
    642698
    643699#if 0
    644   int schedpolicy;
    645   struct sched_param schedparam;
    646 
    647 #if defined(_POSIX_THREAD_CPUTIME)
    648700  int  cputime_clock_allowed;  /* see time.h */
    649 #endif
     701  POSIX_NOT_IMPLEMENTED();
    650702#endif
    651703
     
    687739   */
    688740
    689   is_timesliced = FALSE;
    690 
    691   if ( !_POSIX_Priority_Is_valid( the_attr->schedparam.sched_priority ) )
    692     return EINVAL;
    693  
    694   core_priority = _POSIX_Priority_To_core(the_attr->schedparam.sched_priority);
    695  
     741  if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
     742    return EINVAL;
     743 
     744  core_priority = _POSIX_Priority_To_core( schedparam.sched_priority );
     745 
     746  /*
     747   *  Set the core scheduling policy information.
     748   */
     749
     750  budget_callout = NULL;
     751  budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
     752
    696753  switch ( schedpolicy ) {
    697754    case SCHED_OTHER:
     755      budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
     756      break;
     757     
    698758    case SCHED_FIFO:
     759      budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
    699760      break;
     761
    700762    case SCHED_RR:
    701       is_timesliced = TRUE;
     763      budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
    702764      break;
     765
    703766    case SCHED_SPORADIC:
    704       /*  XXX interpret the following parameters */
    705 #if 0
    706   ss_low_priority;     /* Low scheduling priority for sporadic */
    707   ss_replenish_period; /* Replenishment period for sporadic server */
    708   ss_initial_budget;   /* Initial budget for sporadic server */
    709 #endif
     767      budget_algorithm  = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
     768      budget_callout = _POSIX_Threads_Sporadic_budget_callout;
     769 
     770      if ( _POSIX_Timespec_to_interval( &schedparam.ss_replenish_period ) <
     771           _POSIX_Timespec_to_interval( &schedparam.ss_initial_budget ) )
     772        return EINVAL;
     773
     774      if ( !_POSIX_Priority_Is_valid( schedparam.ss_low_priority ) )
     775        return EINVAL;
     776
    710777      break;
    711778  }
     
    749816    core_priority,
    750817    TRUE,                 /* preemptible */
    751     is_timesliced,        /* timesliced */
     818    budget_algorithm,
     819    budget_callout,
    752820    0,                    /* isr level */
    753821    &default_name         /* posix threads don't have a name */
     
    792860    0                     /* unused */
    793861  );
     862
     863  if ( schedpolicy == SCHED_SPORADIC ) {
     864    _Watchdog_Initialize(
     865      &api->Sporadic_timer,
     866      _POSIX_Threads_Sporadic_budget_TSR,
     867      the_thread->Object.id,
     868      the_thread
     869    );
     870
     871    _Watchdog_Insert_ticks(
     872      &api->Sporadic_timer,
     873      _POSIX_Timespec_to_interval( &api->schedparam.ss_replenish_period )
     874    );
     875  }
    794876
    795877  /*
  • cpukit/posix/src/pthread.c

    red10d76 r624133c  
    1717#include <rtems/posix/priority.h>
    1818#include <rtems/posix/config.h>
     19#include <rtems/posix/time.h>
    1920
    2021/*PAGE
     
    607608/*PAGE
    608609 *
     610 *  _POSIX_Threads_Sporadic_budget_TSR
     611 */
     612
     613void _POSIX_Threads_Sporadic_budget_TSR(
     614  Objects_Id      id,
     615  void           *argument
     616)
     617{
     618  Thread_Control     *the_thread;
     619  POSIX_API_Control  *api;
     620
     621  the_thread = argument;
     622
     623  api = the_thread->API_Extensions[ THREAD_API_POSIX ];
     624
     625  the_thread->cpu_time_budget =
     626    _POSIX_Timespec_to_interval( &api->schedparam.ss_initial_budget );
     627
     628  _Thread_Change_priority(
     629    the_thread,
     630    _POSIX_Priority_To_core( api->schedparam.sched_priority )
     631  );
     632 
     633  _Watchdog_Insert_ticks(
     634    &api->Sporadic_timer,
     635    _POSIX_Timespec_to_interval( &api->schedparam.ss_replenish_period )
     636  );
     637}
     638
     639/*PAGE
     640 *
     641 *  _POSIX_Threads_Sporadic_budget_callout
     642 */
     643
     644void _POSIX_Threads_Sporadic_budget_callout(
     645  Thread_Control *the_thread
     646)
     647{
     648  POSIX_API_Control                  *api;
     649
     650  /* XXX really should be based on MAX_U32 */
     651
     652  api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
     653
     654  the_thread->cpu_time_budget = 0xFFFFFFFF;
     655
     656  _Thread_Change_priority(
     657    the_thread,
     658    _POSIX_Priority_To_core( api->schedparam.ss_low_priority )
     659  );
     660}
     661
     662/*PAGE
     663 *
    609664 *  16.1.2 Thread Creation, P1003.1c/Draft 10, p. 144
    610665 */
     
    617672)
    618673{
    619   const pthread_attr_t  *the_attr;
    620   Priority_Control       core_priority;
    621   boolean                is_timesliced;
    622   boolean                is_fp;
    623   boolean                status;
    624   Thread_Control        *the_thread;
    625   char                  *default_name = "psx";
    626   POSIX_API_Control     *api;
    627   int                    schedpolicy = SCHED_RR;
    628   struct sched_param     schedparam;
     674  const pthread_attr_t               *the_attr;
     675  Priority_Control                    core_priority;
     676  Thread_CPU_budget_algorithms        budget_algorithm;
     677  Thread_CPU_budget_algorithm_callout budget_callout;
     678  boolean                             is_fp;
     679  boolean                             status;
     680  Thread_Control                     *the_thread;
     681  char                               *default_name = "psx";
     682  POSIX_API_Control                  *api;
     683  int                                 schedpolicy = SCHED_RR;
     684  struct sched_param                  schedparam;
    629685
    630686  the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
     
    642698
    643699#if 0
    644   int schedpolicy;
    645   struct sched_param schedparam;
    646 
    647 #if defined(_POSIX_THREAD_CPUTIME)
    648700  int  cputime_clock_allowed;  /* see time.h */
    649 #endif
     701  POSIX_NOT_IMPLEMENTED();
    650702#endif
    651703
     
    687739   */
    688740
    689   is_timesliced = FALSE;
    690 
    691   if ( !_POSIX_Priority_Is_valid( the_attr->schedparam.sched_priority ) )
    692     return EINVAL;
    693  
    694   core_priority = _POSIX_Priority_To_core(the_attr->schedparam.sched_priority);
    695  
     741  if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
     742    return EINVAL;
     743 
     744  core_priority = _POSIX_Priority_To_core( schedparam.sched_priority );
     745 
     746  /*
     747   *  Set the core scheduling policy information.
     748   */
     749
     750  budget_callout = NULL;
     751  budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
     752
    696753  switch ( schedpolicy ) {
    697754    case SCHED_OTHER:
     755      budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
     756      break;
     757     
    698758    case SCHED_FIFO:
     759      budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
    699760      break;
     761
    700762    case SCHED_RR:
    701       is_timesliced = TRUE;
     763      budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
    702764      break;
     765
    703766    case SCHED_SPORADIC:
    704       /*  XXX interpret the following parameters */
    705 #if 0
    706   ss_low_priority;     /* Low scheduling priority for sporadic */
    707   ss_replenish_period; /* Replenishment period for sporadic server */
    708   ss_initial_budget;   /* Initial budget for sporadic server */
    709 #endif
     767      budget_algorithm  = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
     768      budget_callout = _POSIX_Threads_Sporadic_budget_callout;
     769 
     770      if ( _POSIX_Timespec_to_interval( &schedparam.ss_replenish_period ) <
     771           _POSIX_Timespec_to_interval( &schedparam.ss_initial_budget ) )
     772        return EINVAL;
     773
     774      if ( !_POSIX_Priority_Is_valid( schedparam.ss_low_priority ) )
     775        return EINVAL;
     776
    710777      break;
    711778  }
     
    749816    core_priority,
    750817    TRUE,                 /* preemptible */
    751     is_timesliced,        /* timesliced */
     818    budget_algorithm,
     819    budget_callout,
    752820    0,                    /* isr level */
    753821    &default_name         /* posix threads don't have a name */
     
    792860    0                     /* unused */
    793861  );
     862
     863  if ( schedpolicy == SCHED_SPORADIC ) {
     864    _Watchdog_Initialize(
     865      &api->Sporadic_timer,
     866      _POSIX_Threads_Sporadic_budget_TSR,
     867      the_thread->Object.id,
     868      the_thread
     869    );
     870
     871    _Watchdog_Insert_ticks(
     872      &api->Sporadic_timer,
     873      _POSIX_Timespec_to_interval( &api->schedparam.ss_replenish_period )
     874    );
     875  }
    794876
    795877  /*
Note: See TracChangeset for help on using the changeset viewer.