2 #include "scheduler_edf.h"
5 /// List of servers where @p reps_sid_t is the index
6 reps_server_t server_list[REPS_MAX_SERVERS];
8 /** for now, the server id equals to rtems thread id */
10 reps_rv reps_create_server(reps_params_t *p_params, reps_sid_t *p_sid) {
12 for(i = 0; i<REPS_MAX_SERVERS; i++) {
13 if (!server_list[i].params.P)
17 server_list[*p_sid].params = *p_params;
21 reps_rv reps_destroy_server(reps_sid_t sid){
22 server_list[sid].params.P = 0;
23 server_list[sid].params.Q = 0;
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;
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);
53 reps_rv reps_get_sid(tid_t tid, reps_sid_t *p_sid){
55 for(i = 0; i<REPS_MAX_SERVERS; i++) {
56 if (server_list[i].task == tid) {
61 return REPS_E_NO_SERVER_ATTACHED;
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;
69 rtems_timer_delete(node->timer_id);
70 the_thread->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
71 the_thread->budget_callout = NULL;
73 if (sid >= REPS_MAX_SERVERS)
74 return REPS_E_INVALID_SID;
75 server_list[sid].task = 0;
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;
87 reps_rv reps_get_params(reps_sid_t sid, reps_params_t *p_params){
88 *p_params = server_list[sid].params;
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;
99 reps_rv reps_reserve_spare(reps_params_t *p_params){
100 return REPS_E_NOT_IMPLEMENTED;
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;
111 reps_rv reps_init(void){
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;
121 reps_rv reps_cleanup(void){