source: rtems/cpukit/score/src/scheduleredfreleasejob.c @ 8a8b95aa

5
Last change on this file since 8a8b95aa was 4c20da4b, checked in by Sebastian Huber <sebastian.huber@…>, on 04/04/19 at 07:18:11

doxygen: Rename Score* groups in RTEMSScore*

Update #3706

  • Property mode set to 100644
File size: 2.3 KB
Line 
1/**
2 * @file
3 *
4 * @brief Scheduler EDF Release Job
5 * @ingroup RTEMSScoreScheduler
6 */
7
8/*
9 *  Copyright (C) 2011 Petr Benes.
10 *  Copyright (C) 2011 On-Line Applications Research Corporation (OAR).
11 *
12 *  The license and distribution terms for this file may be
13 *  found in the file LICENSE in this distribution or at
14 *  http://www.rtems.org/license/LICENSE.
15 */
16
17#if HAVE_CONFIG_H
18#include "config.h"
19#endif
20
21#include <rtems/score/scheduleredfimpl.h>
22
23Priority_Control _Scheduler_EDF_Map_priority(
24  const Scheduler_Control *scheduler,
25  Priority_Control         priority
26)
27{
28  return SCHEDULER_EDF_PRIO_MSB | SCHEDULER_PRIORITY_MAP( priority );
29}
30
31Priority_Control _Scheduler_EDF_Unmap_priority(
32  const Scheduler_Control *scheduler,
33  Priority_Control         priority
34)
35{
36  return SCHEDULER_PRIORITY_UNMAP( priority & ~SCHEDULER_EDF_PRIO_MSB );
37}
38
39void _Scheduler_EDF_Release_job(
40  const Scheduler_Control *scheduler,
41  Thread_Control          *the_thread,
42  Priority_Node           *priority_node,
43  uint64_t                 deadline,
44  Thread_queue_Context    *queue_context
45)
46{
47  (void) scheduler;
48
49  _Thread_Wait_acquire_critical( the_thread, queue_context );
50
51  /*
52   * There is no integer overflow problem here due to the
53   * SCHEDULER_PRIORITY_MAP().  The deadline is in clock ticks.  With the
54   * minimum clock tick interval of 1us, the uptime is limited to about 146235
55   * years.
56   */
57  _Priority_Node_set_priority(
58    priority_node,
59    SCHEDULER_PRIORITY_MAP( deadline )
60  );
61
62  if ( _Priority_Node_is_active( priority_node ) ) {
63    _Thread_Priority_changed(
64      the_thread,
65      priority_node,
66      false,
67      queue_context
68    );
69  } else {
70    _Thread_Priority_add( the_thread, priority_node, queue_context );
71  }
72
73  _Thread_Wait_release_critical( the_thread, queue_context );
74}
75
76void _Scheduler_EDF_Cancel_job(
77  const Scheduler_Control *scheduler,
78  Thread_Control          *the_thread,
79  Priority_Node           *priority_node,
80  Thread_queue_Context    *queue_context
81)
82{
83  (void) scheduler;
84
85  _Thread_Wait_acquire_critical( the_thread, queue_context );
86
87  if ( _Priority_Node_is_active( priority_node ) ) {
88    _Thread_Priority_remove( the_thread, priority_node, queue_context );
89    _Priority_Node_set_inactive( priority_node );
90  }
91
92  _Thread_Wait_release_critical( the_thread, queue_context );
93}
Note: See TracBrowser for help on using the repository browser.