source: rtems/cpukit/score/src/threadclearstate.c @ 37c7bfcb

4.104.114.84.95
Last change on this file since 37c7bfcb was 96d0b64, checked in by Joel Sherrill <joel.sherrill@…>, on 03/05/07 at 21:01:40

2007-03-05 Joel Sherrill <joel@…>

PR 1222/cpukit

  • score/Makefile.am, score/include/rtems/score/coremutex.h, score/include/rtems/score/threadq.h, score/inline/rtems/score/coremutex.inl, score/src/coremsgsubmit.c, score/src/coremutexsurrender.c, score/src/threadchangepriority.c, score/src/threadclearstate.c, score/src/threadhandler.c, score/src/threadinitialize.c, score/src/threadqdequeuefifo.c, score/src/threadqdequeuepriority.c, score/src/threadqenqueue.c, score/src/threadqenqueuefifo.c, score/src/threadqenqueuepriority.c, score/src/threadqextractfifo.c, score/src/threadqextractpriority.c, score/src/threadsetstate.c: Enhance so that when the prioirity of a thread that is blocked on a priority based thread queue is changed, that its placement in the queue is reevaluated based upon the new priority. This enhancement includes modifications to the SuperCore? as well as new test cases.
  • score/src/threadqrequeue.c: New file.
  • Property mode set to 100644
File size: 2.3 KB
Line 
1/*
2 *  Thread Handler
3 *
4 *
5 *  COPYRIGHT (c) 1989-1999.
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
10 *  http://www.rtems.com/license/LICENSE.
11 *
12 *  $Id$
13 */
14
15#if HAVE_CONFIG_H
16#include "config.h"
17#endif
18
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_Clear_state
36 *
37 *  This kernel routine clears the appropriate states in the
38 *  requested thread.  The thread ready chain is adjusted if
39 *  necessary and the Heir thread is set accordingly.
40 *
41 *  Input parameters:
42 *    the_thread - pointer to thread control block
43 *    state      - state set to clear
44 *
45 *  Output parameters:  NONE
46 *
47 *  INTERRUPT LATENCY:
48 *    priority map
49 *    select heir
50 */
51
52
53void _Thread_Clear_state(
54  Thread_Control *the_thread,
55  States_Control  state
56)
57{
58  ISR_Level       level;
59  States_Control  current_state;
60
61  _ISR_Disable( level );
62    current_state = the_thread->current_state;
63
64    if ( current_state & state ) {
65      current_state =
66      the_thread->current_state = _States_Clear( state, current_state );
67
68      if ( _States_Is_ready( current_state ) ) {
69
70        _Priority_Add_to_bit_map( &the_thread->Priority_map );
71
72        _Chain_Append_unprotected(the_thread->ready, &the_thread->Object.Node);
73
74        _ISR_Flash( level );
75
76        /*
77         *  If the thread that was unblocked is more important than the heir,
78         *  then we have a new heir.  In addition, if the current thread
79         *  is preemptible or we are waking up one of the "pseudo-ISR" system
80         *  threads, then we need to do a context switch.
81         */
82        if ( the_thread->current_priority < _Thread_Heir->current_priority ) {
83          _Thread_Heir = the_thread;
84          if ( _Thread_Executing->is_preemptible ||
85               the_thread->current_priority == 0 )
86            _Context_Switch_necessary = TRUE;
87        }
88      }
89  }
90  _ISR_Enable( level );
91}
Note: See TracBrowser for help on using the repository browser.