#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){
}
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;
}
-