RTEMS
schedulerpriorityunblock.c
Go to the documentation of this file.
1 
8 /*
9  * Scheduler Handler
10  *
11  * Copyright (C) 2010 Gedare Bloom.
12  * Copyright (C) 2011 On-Line Applications Research Corporation (OAR).
13  *
14  * The license and distribution terms for this file may be
15  * found in the file LICENSE in this distribution or at
16  * http://www.rtems.org/license/LICENSE.
17  */
18 
19 #ifdef HAVE_CONFIG_H
20 #include "config.h"
21 #endif
22 
24 
26  const Scheduler_Control *scheduler,
27  Thread_Control *the_thread,
28  Scheduler_Node *node
29 )
30 {
32  Scheduler_priority_Node *the_node;
33  unsigned int priority;
34  unsigned int unmapped_priority;
35 
36  context = _Scheduler_priority_Get_context( scheduler );
37  the_node = _Scheduler_priority_Node_downcast( node );
38  priority = (unsigned int ) _Scheduler_Node_get_priority( &the_node->Base );
39  unmapped_priority = SCHEDULER_PRIORITY_UNMAP( priority );
40 
41  if ( unmapped_priority != the_node->Ready_queue.current_priority ) {
43  &the_node->Ready_queue,
44  unmapped_priority,
45  &context->Bit_map,
46  &context->Ready[ 0 ]
47  );
48  }
49 
51  &the_thread->Object.Node,
52  &the_node->Ready_queue,
53  &context->Bit_map
54  );
55 
56  /* TODO: flash critical section? */
57 
58  /*
59  * If the thread that was unblocked is more important than the heir,
60  * then we have a new heir. This may or may not result in a
61  * context switch.
62  *
63  * Normal case:
64  * If the current thread is preemptible, then we need to do
65  * a context switch.
66  * Pseudo-ISR case:
67  * Even if the thread isn't preemptible, if the new heir is
68  * a pseudo-ISR system task, we need to do a context switch.
69  */
70  if ( priority < _Thread_Get_priority( _Thread_Heir ) ) {
71  _Scheduler_Update_heir( the_thread, priority == PRIORITY_PSEUDO_ISR );
72  }
73 }
Chain_Control Ready[0]
One ready queue per priority level.
static __inline__ void _Scheduler_priority_Ready_queue_enqueue(Chain_Node *node, Scheduler_priority_Ready_queue *ready_queue, Priority_bit_map_Control *bit_map)
Enqueues a node on the specified ready queue.
Scheduler_Node Base
Basic scheduler node.
void _Scheduler_priority_Unblock(const Scheduler_Control *scheduler, Thread_Control *the_thread, Scheduler_Node *node)
Unblocks the thread.
unsigned int current_priority
The thread priority currently used by the scheduler.
static __inline__ Scheduler_priority_Context * _Scheduler_priority_Get_context(const Scheduler_Control *scheduler)
Gets the context of the scheduler.
Inlined Routines Associated with the Manipulation of the Priority-Based Scheduling Structures...
static __inline__ Priority_Control _Scheduler_Node_get_priority(Scheduler_Node *node)
Gets the priority of the node.
static __inline__ void _Scheduler_priority_Ready_queue_update(Scheduler_priority_Ready_queue *ready_queue, unsigned int new_priority, Priority_bit_map_Control *bit_map, Chain_Control *ready_queues)
Updates the specified ready queue data according to the new priority value.
static __inline__ void _Scheduler_Update_heir(Thread_Control *new_heir, bool force_dispatch)
Updates the heir.
Priority_bit_map_Control Bit_map
Bit map to indicate non-empty ready queues.
Scheduler_priority_Ready_queue Ready_queue
The associated ready queue of this node.
Chain_Node Node
Definition: objectdata.h:41
static __inline__ Scheduler_priority_Node * _Scheduler_priority_Node_downcast(Scheduler_Node *node)
Gets the priority node of the scheduler node.
Objects_Control Object
Definition: thread.h:727
#define SCHEDULER_PRIORITY_UNMAP(priority)
Returns the plain priority value.
Scheduler node specialization for Deterministic Priority schedulers.
static __inline__ Priority_Control _Thread_Get_priority(const Thread_Control *the_thread)
Returns the priority of the thread.
Definition: threadimpl.h:1610
#define PRIORITY_PSEUDO_ISR
The priority value of pseudo-ISR threads.
Definition: priority.h:82
Scheduler control.
Definition: scheduler.h:264
Scheduler node for per-thread data.
Definition: schedulernode.h:79