diff options
Diffstat (limited to 'c/src/exec/itron/src/chg_pri.c')
-rw-r--r-- | c/src/exec/itron/src/chg_pri.c | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/c/src/exec/itron/src/chg_pri.c b/c/src/exec/itron/src/chg_pri.c index b2d42905e5..412bab054e 100644 --- a/c/src/exec/itron/src/chg_pri.c +++ b/c/src/exec/itron/src/chg_pri.c @@ -25,6 +25,44 @@ ER chg_pri( PRI tskpri ) { - return E_OK; + register Thread_Control *the_thread; + Objects_Locations location; + Priority_Control new_priority; + + the_thread = _ITRON_Task_Get( tskid, &location ); + if (!the_thread) + _ITRON_return_errorno( _ITRON_Task_Clarify_get_id_error( tskid ) ); + + if (_States_Is_dormant( the_thread->current_state )) + return -1; + + if (( tskpri <= 0 ) || ( tskpri >= 256 )) + _ITRON_return_errorno( E_PAR ); + + switch ( location ) { + case OBJECTS_REMOTE: + case OBJECTS_ERROR: + _ITRON_return_errorno( _ITRON_Task_Clarify_get_id_error( tskid )); + + case OBJECTS_LOCAL: + new_priority = _ITRON_Task_Priority_to_Core( tskpri ); + the_thread->real_priority = new_priority; + + /* + * XXX This is from the rtems side and I'm not sure what this is for. + * XXX Is this check right or should change priority be called + * regardless? + */ + + if ( the_thread->resource_count == 0 || + the_thread->current_priority > new_priority ) + _Thread_Change_priority( the_thread, new_priority, FALSE ); + + _Thread_Enable_dispatch(); + return E_OK; + } + + return E_OBJ; /* XXX - Should never get here */ } + |