summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/scheduleredfprioritycompare.c
blob: 324e44af37b850657a6683f6949ea152a791234c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*
 *  Copyright (C) 2011 Petr Benes.
 *  Copyright (C) 2011 On-Line Applications Research Corporation (OAR).
 *
 *  The license and distribution terms for this file may be
 *  found in the file LICENSE in this distribution or at
 *  http://www.rtems.com/license/LICENSE.
 *
 *  $Id$
 */

#if HAVE_CONFIG_H
#include "config.h"
#endif

#include <rtems/system.h>
#include <rtems/config.h>
#include <rtems/score/scheduleredf.h>

int _Scheduler_EDF_Priority_compare (
  Priority_Control p1,
  Priority_Control p2
)
{
  Watchdog_Interval time = _Watchdog_Ticks_since_boot;

  /*
   * Reorder priorities to separate deadline driven and background tasks.
   *
   * The background tasks have p1 or p2 > SCHEDULER_EDF_PRIO_MSB.
   * The deadline driven tasks need to have subtracted current time in order
   * to see which deadline is closer wrt. current time.
   */
  if (!(p1 & SCHEDULER_EDF_PRIO_MSB))
    p1 = (p1 - time) & ~SCHEDULER_EDF_PRIO_MSB;
  if (!(p2 & SCHEDULER_EDF_PRIO_MSB))
    p2 = (p2 - time) & ~SCHEDULER_EDF_PRIO_MSB;

  return ((p1<p2) - (p1>p2));
}