summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/schedulercbsreleasejob.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2011-09-15 15:49:32 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2011-09-15 15:49:32 +0000
commit82db8e5675c79ddbdf6382308b0ff034e6f02103 (patch)
tree2aef1a6f350019f5a73501beaf6b875b69706099 /cpukit/score/src/schedulercbsreleasejob.c
parent2011-09-15 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff)
downloadrtems-82db8e5675c79ddbdf6382308b0ff034e6f02103.tar.bz2
2011-09-15 Petr Benes <benesp16@fel.cvut.cz>
PR 1906/cpukit * sapi/Makefile.am, sapi/preinstall.am, sapi/include/confdefs.h, score/Makefile.am, score/preinstall.am: Add the CBS (Constant Bandwidth Server) scheduler. This is a complex scheduling policy built atop of the EDF scheduler. Unlike other schedulers, this one provides a user API and handles not only deadlines of tasks but also claimed budget per period. The main aim of the scheduler is isolation of tasks so that each task is guaranteed to meet all deadlines regardless of how other tasks behave. * sapi/include/rtems/cbs.h, sapi/inline/rtems/cbs.inl, score/include/rtems/score/schedulercbs.h, score/src/schedulercbs.c, score/src/schedulercbsattachthread.c, score/src/schedulercbscleanup.c, score/src/schedulercbscreateserver.c, score/src/schedulercbsdestroyserver.c, score/src/schedulercbsdetachthread.c, score/src/schedulercbsgetapprovedbudget.c, score/src/schedulercbsgetexecutiontime.c, score/src/schedulercbsgetparameters.c, score/src/schedulercbsgetremainingbudget.c, score/src/schedulercbsgetserverid.c, score/src/schedulercbsreleasejob.c, score/src/schedulercbssetparameters.c, score/src/schedulercbsunblock.c: New files.
Diffstat (limited to 'cpukit/score/src/schedulercbsreleasejob.c')
-rw-r--r--cpukit/score/src/schedulercbsreleasejob.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/cpukit/score/src/schedulercbsreleasejob.c b/cpukit/score/src/schedulercbsreleasejob.c
new file mode 100644
index 0000000000..c64b60ffb1
--- /dev/null
+++ b/cpukit/score/src/schedulercbsreleasejob.c
@@ -0,0 +1,52 @@
+/*
+ * 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/scheduler.h>
+#include <rtems/score/schedulercbs.h>
+
+void _Scheduler_CBS_Release_job(
+ Thread_Control *the_thread,
+ uint32_t deadline
+)
+{
+ Priority_Control new_priority;
+ Scheduler_CBS_Per_thread *sched_info =
+ (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
+ Scheduler_CBS_Server *serv_info =
+ (Scheduler_CBS_Server *) sched_info->cbs_server;
+
+ if (deadline) {
+ /* Initializing or shifting deadline. */
+ if (serv_info && serv_info->parameters.budget)
+ new_priority = (_Watchdog_Ticks_since_boot + serv_info->parameters.deadline)
+ & ~SCHEDULER_EDF_PRIO_MSB;
+ else
+ new_priority = (_Watchdog_Ticks_since_boot + deadline)
+ & ~SCHEDULER_EDF_PRIO_MSB;
+ }
+ else {
+ /* Switch back to background priority. */
+ new_priority = the_thread->Start.initial_priority;
+ }
+
+ /* Budget replenishment for the next job. */
+ if (serv_info && serv_info->parameters.budget)
+ the_thread->cpu_time_budget = serv_info->parameters.budget;
+
+ the_thread->real_priority = new_priority;
+ _Thread_Change_priority(the_thread, new_priority, true);
+}