]> rtime.felk.cvut.cz Git - rtems-pluggable-edf.git/commitdiff
CBS: reps_lib.c implemented
authorPetr Benes <benesp16@fel.cvut.cz>
Fri, 13 May 2011 00:10:24 +0000 (02:10 +0200)
committerPetr Benes <benesp16@fel.cvut.cz>
Fri, 13 May 2011 00:10:24 +0000 (02:10 +0200)
reps_lib.c is the CBS implementation sitting atop of EDF. The interface
reps_lib.h is a renamed copy of AQuoSA qres_lib.h (aquosa.sourceforge.net).

However, this implementation is not full and also limited to only one
task bound to a server at a time.

src/edf/reps_lib.c
src/edf/reps_lib.h

index dcc5506f6a157883d8b781f67284f52146fc0969..8ac58a125483d8cdd1cd06151e9eaedfcdb620d2 100644 (file)
@@ -1,40 +1,99 @@
 #include "reps_lib.h"
+#include "scheduler_edf.h"
+#include <rtems.h>
 
+/// List of servers where @p reps_sid_t is the index
+reps_server_t server_list[REPS_MAX_SERVERS];
+
+/** for now, the server id equals to rtems thread id */
 
 reps_rv reps_create_server(reps_params_t *p_params, reps_sid_t *p_sid) {
-       return REPS_E_NOT_IMPLEMENTED;
+       unsigned int  i;
+       for(i = 0; i<REPS_MAX_SERVERS; i++) {
+               if (!server_list[i].params.P)
+                       break;
+       }
+       *p_sid = i;
+       server_list[*p_sid].params = *p_params;
+       return REPS_OK;
 }
 
 reps_rv reps_destroy_server(reps_sid_t sid){
-       return REPS_E_NOT_IMPLEMENTED;  
+       server_list[sid].params.P = 0;  
+       server_list[sid].params.Q = 0;  
+       return REPS_OK; 
 }
 
 reps_rv reps_set_params(reps_sid_t sid, reps_params_t *p_params){
-       return REPS_E_NOT_IMPLEMENTED;  
+       server_list[sid].params = *p_params;
+       if (server_list[sid].task) {
+               Objects_Locations location;
+               Thread_Control *the_thread = _Thread_Get(server_list[sid].task, &location);     
+               RBT_Node *node = (RBT_Node*)the_thread->scheduler_info; 
+               node->rel_deadline = p_params->P;
+               node->cmp_time = p_params->Q;
+       }
+       return REPS_OK; 
 }
 
 reps_rv reps_attach_thread(reps_sid_t server_id, tid_t tid){
-       return REPS_E_NOT_IMPLEMENTED;  
+       if (server_list[server_id].task)
+               return REPS_E_MULTIPLE_TASKS_IN_SERVER;
+       server_list[server_id].task = tid;
+       Objects_Locations location;
+       Thread_Control *the_thread = _Thread_Get(tid, &location);
+       RBT_Node *node = (RBT_Node*)the_thread->scheduler_info; 
+       node->rel_deadline = server_list[server_id].params.P;
+       node->cmp_time = server_list[server_id].params.Q;
+       the_thread->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
+       rtems_timer_create(rtems_build_name( 'C', 'B', 'S', 'T' ), &node->timer_id);            
+       return REPS_OK;  
 }
 
 reps_rv reps_get_sid(tid_t tid, reps_sid_t *p_sid){
-       return REPS_E_NOT_IMPLEMENTED;  
+       unsigned int  i;
+       for(i = 0; i<REPS_MAX_SERVERS; i++) {
+               if (server_list[i].task == tid) {
+                       *p_sid = i;
+                       return REPS_OK;
+               }
+       }
+       return REPS_E_NO_SERVER_ATTACHED;       
 }
 
-reps_rv reps_detach_thread(reps_sid_t sid, tid_t tid){
-       return REPS_E_NOT_IMPLEMENTED;  
+reps_rv reps_detach_thread(reps_sid_t sid, tid_t tid) {
+       Objects_Locations location;
+       Thread_Control *the_thread = _Thread_Get(tid, &location);
+       RBT_Node *node = (RBT_Node*)the_thread->scheduler_info; 
+       node->cmp_time = 0;
+       rtems_timer_delete(node->timer_id);     
+       the_thread->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
+       the_thread->budget_callout = NULL;              
+       
+       if (sid >= REPS_MAX_SERVERS)
+               return REPS_E_INVALID_SID;
+       server_list[sid].task = 0;      
+       return REPS_OK; 
 }
 
 reps_rv reps_get_exec_time (reps_sid_t sid, reps_time_t *exec_time){
-       return REPS_E_NOT_IMPLEMENTED;  
+       Objects_Locations location;
+       Thread_Control *the_thread = _Thread_Get(server_list[sid].task, &location);     
+       RBT_Node *node = (RBT_Node*)the_thread->scheduler_info; 
+       *exec_time = node->cmp_time - the_thread->cpu_time_budget;
+       return REPS_OK; 
 }
 
 reps_rv reps_get_params(reps_sid_t sid, reps_params_t *p_params){
-       return REPS_E_NOT_IMPLEMENTED;  
+       *p_params = server_list[sid].params;
+       return REPS_OK; 
 }
 
 reps_rv reps_get_curr_budget(reps_sid_t sid, reps_time_t *curr_budget){
-       return REPS_E_NOT_IMPLEMENTED;  
+       Objects_Locations location;
+       Thread_Control *the_thread = _Thread_Get(server_list[sid].task, &location);     
+       *curr_budget = the_thread->cpu_time_budget;
+       return REPS_OK; 
 }
 
 reps_rv reps_reserve_spare(reps_params_t *p_params){
@@ -42,14 +101,23 @@ reps_rv reps_reserve_spare(reps_params_t *p_params){
 }
 
 reps_rv reps_get_appr_budget (reps_sid_t sid, reps_time_t *appr_budget){
-       return REPS_E_NOT_IMPLEMENTED;  
+       Objects_Locations location;
+       Thread_Control *the_thread = _Thread_Get(server_list[sid].task, &location);     
+       RBT_Node *node = (RBT_Node*)the_thread->scheduler_info;         
+       *appr_budget = node->cmp_time;
+       return REPS_OK; 
 }
 
 reps_rv reps_init(void){
+       unsigned int  i;
+       for(i = 0; i<REPS_MAX_SERVERS; i++) {
+               server_list[i].params.P = 0;
+               server_list[i].params.Q = 0;
+               server_list[i].task = 0;
+       }               
        return REPS_OK; 
 }
 
 reps_rv reps_cleanup(void){
        return REPS_OK; 
 }
-
index a3a2991f75feecbb0bbff0a820f85ff90b939c9b..b228389cfbce59f58f3745061c92766e64275f0a 100644 (file)
@@ -8,10 +8,18 @@
 #define REPS_OK                        0
 #define REPS_E_MISSING_COMPONENT       1
 #define REPS_E_NOT_IMPLEMENTED         2
+#define REPS_E_MULTIPLE_TASKS_IN_SERVER        3       //for now
+#define REPS_E_NO_SERVER_ATTACHED      4
+#define REPS_E_INVALID_SID             5
+
+#define REPS_MAX_SERVERS       5
 
 /// server id
 typedef uint32_t reps_sid_t;
 
+/// task id
+typedef rtems_id tid_t;
+
 /// return value
 typedef int reps_rv;
 
@@ -22,7 +30,10 @@ typedef struct {
        long long Q;
 } reps_params_t;
 
-typedef rtems_id tid_t;
+typedef struct {
+       tid_t task; // only one task per server so far
+       reps_params_t params;
+} reps_server_t;
 
 
 /// creates a server == allocates an empty bandwidth in the scheduler