]> rtime.felk.cvut.cz Git - rtems-pluggable-edf.git/blob - src/edf/reps_lib.c
8ac58a125483d8cdd1cd06151e9eaedfcdb620d2
[rtems-pluggable-edf.git] / src / edf / reps_lib.c
1 #include "reps_lib.h"
2 #include "scheduler_edf.h"
3 #include <rtems.h>
4
5 /// List of servers where @p reps_sid_t is the index
6 reps_server_t server_list[REPS_MAX_SERVERS];
7
8 /** for now, the server id equals to rtems thread id */
9
10 reps_rv reps_create_server(reps_params_t *p_params, reps_sid_t *p_sid) {
11         unsigned int  i;
12         for(i = 0; i<REPS_MAX_SERVERS; i++) {
13                 if (!server_list[i].params.P)
14                         break;
15         }
16         *p_sid = i;
17         server_list[*p_sid].params = *p_params;
18         return REPS_OK;
19 }
20
21 reps_rv reps_destroy_server(reps_sid_t sid){
22         server_list[sid].params.P = 0;  
23         server_list[sid].params.Q = 0;  
24         return REPS_OK; 
25 }
26
27 reps_rv reps_set_params(reps_sid_t sid, reps_params_t *p_params){
28         server_list[sid].params = *p_params;
29         if (server_list[sid].task) {
30                 Objects_Locations location;
31                 Thread_Control *the_thread = _Thread_Get(server_list[sid].task, &location);     
32                 RBT_Node *node = (RBT_Node*)the_thread->scheduler_info; 
33                 node->rel_deadline = p_params->P;
34                 node->cmp_time = p_params->Q;
35         }
36         return REPS_OK; 
37 }
38
39 reps_rv reps_attach_thread(reps_sid_t server_id, tid_t tid){
40         if (server_list[server_id].task)
41                 return REPS_E_MULTIPLE_TASKS_IN_SERVER;
42         server_list[server_id].task = tid;
43         Objects_Locations location;
44         Thread_Control *the_thread = _Thread_Get(tid, &location);
45         RBT_Node *node = (RBT_Node*)the_thread->scheduler_info; 
46         node->rel_deadline = server_list[server_id].params.P;
47         node->cmp_time = server_list[server_id].params.Q;
48         the_thread->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
49         rtems_timer_create(rtems_build_name( 'C', 'B', 'S', 'T' ), &node->timer_id);            
50         return REPS_OK;  
51 }
52
53 reps_rv reps_get_sid(tid_t tid, reps_sid_t *p_sid){
54         unsigned int  i;
55         for(i = 0; i<REPS_MAX_SERVERS; i++) {
56                 if (server_list[i].task == tid) {
57                         *p_sid = i;
58                         return REPS_OK;
59                 }
60         }
61         return REPS_E_NO_SERVER_ATTACHED;       
62 }
63
64 reps_rv reps_detach_thread(reps_sid_t sid, tid_t tid) {
65         Objects_Locations location;
66         Thread_Control *the_thread = _Thread_Get(tid, &location);
67         RBT_Node *node = (RBT_Node*)the_thread->scheduler_info; 
68         node->cmp_time = 0;
69         rtems_timer_delete(node->timer_id);     
70         the_thread->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
71         the_thread->budget_callout = NULL;              
72         
73         if (sid >= REPS_MAX_SERVERS)
74                 return REPS_E_INVALID_SID;
75         server_list[sid].task = 0;      
76         return REPS_OK; 
77 }
78
79 reps_rv reps_get_exec_time (reps_sid_t sid, reps_time_t *exec_time){
80         Objects_Locations location;
81         Thread_Control *the_thread = _Thread_Get(server_list[sid].task, &location);     
82         RBT_Node *node = (RBT_Node*)the_thread->scheduler_info; 
83         *exec_time = node->cmp_time - the_thread->cpu_time_budget;
84         return REPS_OK; 
85 }
86
87 reps_rv reps_get_params(reps_sid_t sid, reps_params_t *p_params){
88         *p_params = server_list[sid].params;
89         return REPS_OK; 
90 }
91
92 reps_rv reps_get_curr_budget(reps_sid_t sid, reps_time_t *curr_budget){
93         Objects_Locations location;
94         Thread_Control *the_thread = _Thread_Get(server_list[sid].task, &location);     
95         *curr_budget = the_thread->cpu_time_budget;
96         return REPS_OK; 
97 }
98
99 reps_rv reps_reserve_spare(reps_params_t *p_params){
100         return REPS_E_NOT_IMPLEMENTED;  
101 }
102
103 reps_rv reps_get_appr_budget (reps_sid_t sid, reps_time_t *appr_budget){
104         Objects_Locations location;
105         Thread_Control *the_thread = _Thread_Get(server_list[sid].task, &location);     
106         RBT_Node *node = (RBT_Node*)the_thread->scheduler_info;         
107         *appr_budget = node->cmp_time;
108         return REPS_OK; 
109 }
110
111 reps_rv reps_init(void){
112         unsigned int  i;
113         for(i = 0; i<REPS_MAX_SERVERS; i++) {
114                 server_list[i].params.P = 0;
115                 server_list[i].params.Q = 0;
116                 server_list[i].task = 0;
117         }               
118         return REPS_OK; 
119 }
120
121 reps_rv reps_cleanup(void){
122         return REPS_OK; 
123 }