summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src
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
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')
-rw-r--r--cpukit/score/src/schedulercbs.c59
-rw-r--r--cpukit/score/src/schedulercbsattachthread.c63
-rw-r--r--cpukit/score/src/schedulercbscleanup.c31
-rw-r--r--cpukit/score/src/schedulercbscreateserver.c55
-rw-r--r--cpukit/score/src/schedulercbsdestroyserver.c40
-rw-r--r--cpukit/score/src/schedulercbsdetachthread.c56
-rw-r--r--cpukit/score/src/schedulercbsgetapprovedbudget.c33
-rw-r--r--cpukit/score/src/schedulercbsgetexecutiontime.c53
-rw-r--r--cpukit/score/src/schedulercbsgetparameters.c33
-rw-r--r--cpukit/score/src/schedulercbsgetremainingbudget.c52
-rw-r--r--cpukit/score/src/schedulercbsgetserverid.c35
-rw-r--r--cpukit/score/src/schedulercbsreleasejob.c52
-rw-r--r--cpukit/score/src/schedulercbssetparameters.c40
-rw-r--r--cpukit/score/src/schedulercbsunblock.c76
14 files changed, 678 insertions, 0 deletions
diff --git a/cpukit/score/src/schedulercbs.c b/cpukit/score/src/schedulercbs.c
new file mode 100644
index 0000000000..dba4925b8d
--- /dev/null
+++ b/cpukit/score/src/schedulercbs.c
@@ -0,0 +1,59 @@
+/*
+ * 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>
+#include <rtems/rtems/signal.h>
+
+void _Scheduler_CBS_Budget_callout(
+ Thread_Control *the_thread
+)
+{
+ Priority_Control new_priority;
+ Scheduler_CBS_Per_thread *sched_info;
+ Scheduler_CBS_Server_id server_id;
+
+ /* Put violating task to background until the end of period. */
+ new_priority = the_thread->Start.initial_priority;
+ if ( the_thread->real_priority != new_priority )
+ the_thread->real_priority = new_priority;
+ if ( the_thread->current_priority != new_priority )
+ _Thread_Change_priority(the_thread, new_priority, true);
+
+ /* Invoke callback function if any. */
+ sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
+ if ( sched_info->cbs_server->cbs_budget_overrun ) {
+ _Scheduler_CBS_Get_server_id(
+ sched_info->cbs_server->task_id,
+ &server_id
+ );
+ sched_info->cbs_server->cbs_budget_overrun( server_id );
+ }
+}
+
+int _Scheduler_CBS_Initialize(void)
+{
+ unsigned int i;
+ _Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
+ _Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
+ if ( !_Scheduler_CBS_Server_list )
+ return SCHEDULER_CBS_ERROR_NO_MEMORY;
+ for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) {
+ _Scheduler_CBS_Server_list[i] = NULL;
+ }
+ return SCHEDULER_CBS_OK;
+}
diff --git a/cpukit/score/src/schedulercbsattachthread.c b/cpukit/score/src/schedulercbsattachthread.c
new file mode 100644
index 0000000000..7796f12a6b
--- /dev/null
+++ b/cpukit/score/src/schedulercbsattachthread.c
@@ -0,0 +1,63 @@
+/*
+ * 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>
+#include <rtems/rtems/object.h>
+
+int _Scheduler_CBS_Attach_thread (
+ Scheduler_CBS_Server_id server_id,
+ rtems_id task_id
+)
+{
+ Objects_Locations location;
+ Thread_Control *the_thread;
+ Scheduler_CBS_Per_thread *sched_info;
+
+ if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
+ return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+
+ the_thread = _Thread_Get(task_id, &location);
+ /* The routine _Thread_Get may disable dispatch and not enable again. */
+ if ( the_thread )
+ _Thread_Enable_dispatch();
+ if ( !the_thread )
+ return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+
+ sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
+
+ /* Thread is already attached to a server. */
+ if ( sched_info->cbs_server )
+ return SCHEDULER_CBS_ERROR_FULL;
+
+ /* Server is not valid. */
+ if ( !_Scheduler_CBS_Server_list[server_id] )
+ return SCHEDULER_CBS_ERROR_NOSERVER;
+
+ /* Server is already attached to a thread. */
+ if ( _Scheduler_CBS_Server_list[server_id]->task_id != -1 )
+ return SCHEDULER_CBS_ERROR_FULL;
+
+ _Scheduler_CBS_Server_list[server_id]->task_id = task_id;
+ sched_info->cbs_server = (void *) _Scheduler_CBS_Server_list[server_id];
+
+ the_thread->budget_callout = _Scheduler_CBS_Budget_callout;
+ the_thread->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
+ the_thread->is_preemptible = true;
+
+ return SCHEDULER_CBS_OK;
+}
diff --git a/cpukit/score/src/schedulercbscleanup.c b/cpukit/score/src/schedulercbscleanup.c
new file mode 100644
index 0000000000..c6c0b94129
--- /dev/null
+++ b/cpukit/score/src/schedulercbscleanup.c
@@ -0,0 +1,31 @@
+/*
+ * 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>
+
+int _Scheduler_CBS_Cleanup (void)
+{
+ unsigned int i;
+
+ for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
+ if ( _Scheduler_CBS_Server_list[ i ] )
+ _Scheduler_CBS_Destroy_server( i );
+ }
+ _Workspace_Free( _Scheduler_CBS_Server_list );
+ return SCHEDULER_CBS_OK;
+}
diff --git a/cpukit/score/src/schedulercbscreateserver.c b/cpukit/score/src/schedulercbscreateserver.c
new file mode 100644
index 0000000000..c604423d50
--- /dev/null
+++ b/cpukit/score/src/schedulercbscreateserver.c
@@ -0,0 +1,55 @@
+/*
+ * 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>
+
+int _Scheduler_CBS_Create_server (
+ Scheduler_CBS_Parameters *params,
+ Scheduler_CBS_Budget_overrun budget_overrun_callback,
+ rtems_id *server_id
+)
+{
+ unsigned int i;
+ Scheduler_CBS_Server *the_server;
+
+ if ( params->budget <= 0 ||
+ params->deadline <= 0 ||
+ params->budget >= SCHEDULER_EDF_PRIO_MSB ||
+ params->deadline >= SCHEDULER_EDF_PRIO_MSB )
+ return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+
+ for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
+ if ( !_Scheduler_CBS_Server_list[i] )
+ break;
+ }
+
+ if ( i == _Scheduler_CBS_Maximum_servers )
+ return SCHEDULER_CBS_ERROR_FULL;
+
+ *server_id = i;
+ _Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
+ _Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
+ the_server = _Scheduler_CBS_Server_list[*server_id];
+ if ( !the_server )
+ return SCHEDULER_CBS_ERROR_NO_MEMORY;
+
+ the_server->parameters = *params;
+ the_server->task_id = -1;
+ the_server->cbs_budget_overrun = budget_overrun_callback;
+ return SCHEDULER_CBS_OK;
+}
diff --git a/cpukit/score/src/schedulercbsdestroyserver.c b/cpukit/score/src/schedulercbsdestroyserver.c
new file mode 100644
index 0000000000..85867cf7dc
--- /dev/null
+++ b/cpukit/score/src/schedulercbsdestroyserver.c
@@ -0,0 +1,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/scheduler.h>
+#include <rtems/score/schedulercbs.h>
+
+int _Scheduler_CBS_Destroy_server (
+ Scheduler_CBS_Server_id server_id
+)
+{
+ int ret = SCHEDULER_CBS_OK;
+ rtems_id tid;
+
+ if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
+ return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+
+ if ( !_Scheduler_CBS_Server_list[server_id] )
+ return SCHEDULER_CBS_ERROR_NOSERVER;
+
+ if ( (tid = _Scheduler_CBS_Server_list[server_id]->task_id) != -1 )
+ ret = _Scheduler_CBS_Detach_thread ( server_id, tid );
+
+ _Workspace_Free( _Scheduler_CBS_Server_list[server_id] );
+ _Scheduler_CBS_Server_list[server_id] = NULL;
+ return ret;
+}
diff --git a/cpukit/score/src/schedulercbsdetachthread.c b/cpukit/score/src/schedulercbsdetachthread.c
new file mode 100644
index 0000000000..65aa88dd8f
--- /dev/null
+++ b/cpukit/score/src/schedulercbsdetachthread.c
@@ -0,0 +1,56 @@
+/*
+ * 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>
+
+int _Scheduler_CBS_Detach_thread (
+ Scheduler_CBS_Server_id server_id,
+ rtems_id task_id
+)
+{
+ Objects_Locations location;
+ Thread_Control *the_thread;
+ Scheduler_CBS_Per_thread *sched_info;
+
+ the_thread = _Thread_Get(task_id, &location);
+ /* The routine _Thread_Get may disable dispatch and not enable again. */
+ if ( the_thread ) {
+ _Thread_Enable_dispatch();
+ sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
+ }
+
+ if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
+ return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+ if ( !the_thread )
+ return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+ /* Server is not valid. */
+ if ( !_Scheduler_CBS_Server_list[server_id] )
+ return SCHEDULER_CBS_ERROR_NOSERVER;
+ /* Thread and server are not attached. */
+ if ( _Scheduler_CBS_Server_list[server_id]->task_id != task_id )
+ return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+
+ _Scheduler_CBS_Server_list[server_id]->task_id = -1;
+ sched_info->cbs_server = NULL;
+
+ the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
+ the_thread->budget_callout = the_thread->Start.budget_callout;
+ the_thread->is_preemptible = the_thread->Start.is_preemptible;
+
+ return SCHEDULER_CBS_OK;
+}
diff --git a/cpukit/score/src/schedulercbsgetapprovedbudget.c b/cpukit/score/src/schedulercbsgetapprovedbudget.c
new file mode 100644
index 0000000000..14db13031f
--- /dev/null
+++ b/cpukit/score/src/schedulercbsgetapprovedbudget.c
@@ -0,0 +1,33 @@
+/*
+ * 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>
+
+int _Scheduler_CBS_Get_approved_budget (
+ Scheduler_CBS_Server_id server_id,
+ time_t *approved_budget
+)
+{
+ if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
+ return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+ if ( !_Scheduler_CBS_Server_list[server_id] )
+ return SCHEDULER_CBS_ERROR_NOSERVER;
+
+ *approved_budget = _Scheduler_CBS_Server_list[server_id]->parameters.budget;
+ return SCHEDULER_CBS_OK;
+}
diff --git a/cpukit/score/src/schedulercbsgetexecutiontime.c b/cpukit/score/src/schedulercbsgetexecutiontime.c
new file mode 100644
index 0000000000..b8d92ada30
--- /dev/null
+++ b/cpukit/score/src/schedulercbsgetexecutiontime.c
@@ -0,0 +1,53 @@
+/*
+ * 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>
+
+int _Scheduler_CBS_Get_execution_time (
+ Scheduler_CBS_Server_id server_id,
+ time_t *exec_time,
+ time_t *abs_time
+)
+{
+ Objects_Locations location;
+ Thread_Control *the_thread;
+
+ if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
+ return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+ if ( !_Scheduler_CBS_Server_list[server_id] )
+ return SCHEDULER_CBS_ERROR_NOSERVER;
+ if ( !_Scheduler_CBS_Server_list[server_id]->task_id ) {
+ *exec_time = 0;
+ return SCHEDULER_CBS_OK;
+ }
+
+ the_thread = _Thread_Get(
+ _Scheduler_CBS_Server_list[server_id]->task_id,
+ &location
+ );
+ /* The routine _Thread_Get may disable dispatch and not enable again. */
+ if ( the_thread ) {
+ _Thread_Enable_dispatch();
+ *exec_time = _Scheduler_CBS_Server_list[server_id]->parameters.budget -
+ the_thread->cpu_time_budget;
+ }
+ else {
+ *exec_time = _Scheduler_CBS_Server_list[server_id]->parameters.budget;
+ }
+ return SCHEDULER_CBS_OK;
+}
diff --git a/cpukit/score/src/schedulercbsgetparameters.c b/cpukit/score/src/schedulercbsgetparameters.c
new file mode 100644
index 0000000000..450afd0d68
--- /dev/null
+++ b/cpukit/score/src/schedulercbsgetparameters.c
@@ -0,0 +1,33 @@
+/*
+ * 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>
+
+int _Scheduler_CBS_Get_parameters (
+ Scheduler_CBS_Server_id server_id,
+ Scheduler_CBS_Parameters *params
+)
+{
+ if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
+ return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+ if ( !_Scheduler_CBS_Server_list[server_id] )
+ return SCHEDULER_CBS_ERROR_NOSERVER;
+
+ *params = _Scheduler_CBS_Server_list[server_id]->parameters;
+ return SCHEDULER_CBS_OK;
+}
diff --git a/cpukit/score/src/schedulercbsgetremainingbudget.c b/cpukit/score/src/schedulercbsgetremainingbudget.c
new file mode 100644
index 0000000000..664c7e1bc4
--- /dev/null
+++ b/cpukit/score/src/schedulercbsgetremainingbudget.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>
+
+int _Scheduler_CBS_Get_remaining_budget (
+ Scheduler_CBS_Server_id server_id,
+ time_t *remaining_budget
+)
+{
+ Objects_Locations location;
+ Thread_Control *the_thread;
+
+ if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
+ return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+ if ( !_Scheduler_CBS_Server_list[server_id] )
+ return SCHEDULER_CBS_ERROR_NOSERVER;
+ if ( _Scheduler_CBS_Server_list[server_id]->task_id == -1 ) {
+ *remaining_budget = _Scheduler_CBS_Server_list[server_id]->parameters.budget;
+ return SCHEDULER_CBS_OK;
+ }
+
+ the_thread = _Thread_Get(
+ _Scheduler_CBS_Server_list[server_id]->task_id,
+ &location
+ );
+ /* The routine _Thread_Get may disable dispatch and not enable again. */
+ if ( the_thread ) {
+ _Thread_Enable_dispatch();
+ *remaining_budget = the_thread->cpu_time_budget;
+ }
+ else {
+ *remaining_budget = 0;
+ }
+
+ return SCHEDULER_CBS_OK;
+}
diff --git a/cpukit/score/src/schedulercbsgetserverid.c b/cpukit/score/src/schedulercbsgetserverid.c
new file mode 100644
index 0000000000..1460b0c058
--- /dev/null
+++ b/cpukit/score/src/schedulercbsgetserverid.c
@@ -0,0 +1,35 @@
+/*
+ * 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>
+
+int _Scheduler_CBS_Get_server_id (
+ rtems_id task_id,
+ Scheduler_CBS_Server_id *server_id
+)
+{
+ unsigned int i;
+ for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
+ if ( _Scheduler_CBS_Server_list[i] &&
+ _Scheduler_CBS_Server_list[i]->task_id == task_id ) {
+ *server_id = i;
+ return SCHEDULER_CBS_OK;
+ }
+ }
+ return SCHEDULER_CBS_ERROR_NOSERVER;
+}
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);
+}
diff --git a/cpukit/score/src/schedulercbssetparameters.c b/cpukit/score/src/schedulercbssetparameters.c
new file mode 100644
index 0000000000..4268110364
--- /dev/null
+++ b/cpukit/score/src/schedulercbssetparameters.c
@@ -0,0 +1,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/scheduler.h>
+#include <rtems/score/schedulercbs.h>
+
+int _Scheduler_CBS_Set_parameters (
+ Scheduler_CBS_Server_id server_id,
+ Scheduler_CBS_Parameters *params
+)
+{
+ if ( server_id < 0 || server_id >= _Scheduler_CBS_Maximum_servers )
+ return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+
+ if ( params->budget <= 0 ||
+ params->deadline <= 0 ||
+ params->budget >= SCHEDULER_EDF_PRIO_MSB ||
+ params->deadline >= SCHEDULER_EDF_PRIO_MSB )
+ return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
+
+ if ( !_Scheduler_CBS_Server_list[server_id] )
+ return SCHEDULER_CBS_ERROR_NOSERVER;
+
+ _Scheduler_CBS_Server_list[server_id]->parameters = *params;
+ return SCHEDULER_CBS_OK;
+}
diff --git a/cpukit/score/src/schedulercbsunblock.c b/cpukit/score/src/schedulercbsunblock.c
new file mode 100644
index 0000000000..0f417d8c9e
--- /dev/null
+++ b/cpukit/score/src/schedulercbsunblock.c
@@ -0,0 +1,76 @@
+/*
+ * 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/score/scheduler.h>
+#include <rtems/score/schedulercbs.h>
+
+void _Scheduler_CBS_Unblock(
+ Thread_Control *the_thread
+)
+{
+ Scheduler_CBS_Per_thread *sched_info;
+ Scheduler_CBS_Server *serv_info;
+ Priority_Control new_priority;
+
+ _Scheduler_EDF_Enqueue(the_thread);
+ /* TODO: flash critical section? */
+
+ sched_info = (Scheduler_CBS_Per_thread *) the_thread->scheduler_info;
+ serv_info = (Scheduler_CBS_Server *) sched_info->cbs_server;
+
+ /*
+ * Late unblock rule for deadline-driven tasks. The remaining time to
+ * deadline must be sufficient to serve the remaining computation time
+ * without increased utilization of this task. It might cause a deadline
+ * miss of another task.
+ */
+ if (serv_info) {
+ time_t deadline = serv_info->parameters.deadline;
+ time_t budget = serv_info->parameters.budget;
+ time_t deadline_left = the_thread->cpu_time_budget;
+ time_t budget_left = the_thread->real_priority -
+ _Watchdog_Ticks_since_boot;
+
+ if ( deadline*budget_left > budget*deadline_left ) {
+ /* Put late unblocked task to background until the end of period. */
+ new_priority = the_thread->Start.initial_priority;
+ if ( the_thread->real_priority != new_priority )
+ the_thread->real_priority = new_priority;
+ if ( the_thread->current_priority != new_priority )
+ _Thread_Change_priority(the_thread, new_priority, true);
+ }
+ }
+
+ /*
+ * If the thread that was unblocked is more important than the heir,
+ * then we have a new heir. This may or may not result in a
+ * context switch.
+ *
+ * Normal case:
+ * If the current thread is preemptible, then we need to do
+ * a context switch.
+ * Pseudo-ISR case:
+ * Even if the thread isn't preemptible, if the new heir is
+ * a pseudo-ISR system task, we need to do a context switch.
+ */
+ if ( _Scheduler_Is_priority_higher_than( the_thread->current_priority,
+ _Thread_Heir->current_priority)) {
+ _Thread_Heir = the_thread;
+ if ( _Thread_Executing->is_preemptible ||
+ the_thread->current_priority == 0 )
+ _Thread_Dispatch_necessary = true;
+ }
+}