[05df0a8] | 1 | /* |
---|
| 2 | * Thread Handler |
---|
| 3 | * |
---|
| 4 | * |
---|
[08311cc3] | 5 | * COPYRIGHT (c) 1989-1999. |
---|
[05df0a8] | 6 | * On-Line Applications Research Corporation (OAR). |
---|
| 7 | * |
---|
| 8 | * The license and distribution terms for this file may be |
---|
| 9 | * found in found in the file LICENSE in this distribution or at |
---|
[dd687d97] | 10 | * http://www.rtems.com/license/LICENSE. |
---|
[05df0a8] | 11 | * |
---|
| 12 | * $Id$ |
---|
| 13 | */ |
---|
| 14 | |
---|
[a8eed23] | 15 | #if HAVE_CONFIG_H |
---|
| 16 | #include "config.h" |
---|
| 17 | #endif |
---|
| 18 | |
---|
[05df0a8] | 19 | #include <rtems/system.h> |
---|
| 20 | #include <rtems/score/apiext.h> |
---|
| 21 | #include <rtems/score/context.h> |
---|
| 22 | #include <rtems/score/interr.h> |
---|
| 23 | #include <rtems/score/isr.h> |
---|
| 24 | #include <rtems/score/object.h> |
---|
| 25 | #include <rtems/score/priority.h> |
---|
| 26 | #include <rtems/score/states.h> |
---|
| 27 | #include <rtems/score/sysstate.h> |
---|
| 28 | #include <rtems/score/thread.h> |
---|
| 29 | #include <rtems/score/threadq.h> |
---|
| 30 | #include <rtems/score/userext.h> |
---|
| 31 | #include <rtems/score/wkspace.h> |
---|
| 32 | |
---|
| 33 | /*PAGE |
---|
| 34 | * |
---|
| 35 | * _Thread_Tickle_timeslice |
---|
| 36 | * |
---|
| 37 | * This scheduler routine determines if timeslicing is enabled |
---|
| 38 | * for the currently executing thread and, if so, updates the |
---|
| 39 | * timeslice count and checks for timeslice expiration. |
---|
| 40 | * |
---|
| 41 | * Input parameters: NONE |
---|
| 42 | * |
---|
| 43 | * Output parameters: NONE |
---|
| 44 | */ |
---|
| 45 | |
---|
| 46 | void _Thread_Tickle_timeslice( void ) |
---|
| 47 | { |
---|
| 48 | Thread_Control *executing; |
---|
| 49 | |
---|
| 50 | executing = _Thread_Executing; |
---|
| 51 | |
---|
[c3330a8] | 52 | #ifndef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS |
---|
| 53 | /* |
---|
| 54 | * Increment the number of ticks this thread has been executing |
---|
| 55 | */ |
---|
| 56 | executing->ticks_executed++; |
---|
| 57 | #endif |
---|
[05df0a8] | 58 | |
---|
| 59 | /* |
---|
[a0ed4ed] | 60 | * If the thread is not preemptible or is not ready, then |
---|
[05df0a8] | 61 | * just return. |
---|
| 62 | */ |
---|
| 63 | |
---|
| 64 | if ( !executing->is_preemptible ) |
---|
| 65 | return; |
---|
| 66 | |
---|
| 67 | if ( !_States_Is_ready( executing->current_state ) ) |
---|
| 68 | return; |
---|
| 69 | |
---|
| 70 | /* |
---|
| 71 | * The cpu budget algorithm determines what happens next. |
---|
| 72 | */ |
---|
| 73 | |
---|
| 74 | switch ( executing->budget_algorithm ) { |
---|
| 75 | case THREAD_CPU_BUDGET_ALGORITHM_NONE: |
---|
| 76 | break; |
---|
| 77 | |
---|
| 78 | case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE: |
---|
| 79 | case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE: |
---|
[c25cea9] | 80 | if ( (int)(--executing->cpu_time_budget) <= 0 ) { |
---|
[05df0a8] | 81 | _Thread_Reset_timeslice(); |
---|
| 82 | executing->cpu_time_budget = _Thread_Ticks_per_timeslice; |
---|
| 83 | } |
---|
| 84 | break; |
---|
| 85 | |
---|
| 86 | case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT: |
---|
| 87 | if ( --executing->cpu_time_budget == 0 ) |
---|
| 88 | (*executing->budget_callout)( executing ); |
---|
| 89 | break; |
---|
| 90 | } |
---|
| 91 | } |
---|