122,15 → 122,6 |
|
} |
|
int restart_task(PID p) { |
int budget, local_scheduler_level, scheduler_id; |
fsf_server_id_t server; |
|
fsf_get_server(p, &server); |
fsf_settask_preemptive(&server, p); |
return task_activate(p); |
} |
|
int fsf_schedule_timed_job |
(const struct timespec *at_absolute_time, |
struct timespec *next_budget, |
138,13 → 129,10 |
bool *was_deadline_missed, |
bool *was_budget_overran) |
{ |
|
TIME T,Q,D; |
int budget, local_scheduler_level, scheduler_id; |
SYS_FLAGS f; |
fsf_server_id_t server; |
|
f=kern_fsave(); |
|
local_scheduler_level = SERVER_get_local_scheduler_level_from_pid(fsf_server_level, exec_shadow); |
scheduler_id = SERVER_get_local_scheduler_id_from_pid(fsf_server_level, exec_shadow); |
|
169,10 → 157,7 |
break; |
} |
|
if (budget == -1) { |
kern_frestore(f); |
return FSF_ERR_BAD_ARGUMENT; |
} |
if (budget == -1) return FSF_ERR_BAD_ARGUMENT; |
|
if (next_budget != NULL && next_period != NULL) { |
|
194,11 → 179,8 |
if (was_budget_overran != NULL) |
*was_budget_overran = false; |
|
if (at_absolute_time != NULL) { |
fsf_get_server(exec_shadow, &server); |
fsf_settask_nopreemptive(&server, exec_shadow); |
kern_event_post(at_absolute_time, (void (*)(void *))restart_task, (void *)(exec_shadow)); |
} |
if (at_absolute_time != NULL) |
kern_event_post(at_absolute_time, (void (*)(void *))task_activate, (void *)(exec_shadow)); |
|
#ifdef FSF_DEBUG |
if (at_absolute_time != NULL) |
207,7 → 189,6 |
kern_printf("(End Cycle %d)",exec_shadow); |
#endif |
|
kern_frestore(f); |
task_endcycle(); |
|
return 0; |
225,17 → 206,11 |
TIME T,Q,D; |
int index,oldindex; |
int budget, local_scheduler_level, scheduler_id; |
SYS_FLAGS f; |
|
f=kern_fsave(); |
|
local_scheduler_level = SERVER_get_local_scheduler_level_from_pid(fsf_server_level, exec_shadow); |
scheduler_id = SERVER_get_local_scheduler_id_from_pid(fsf_server_level, exec_shadow); |
|
if (proc_table[exec_shadow].task_level != local_scheduler_level) { |
kern_frestore(f); |
return 0; |
} |
if (proc_table[exec_shadow].task_level != local_scheduler_level) return 0; |
|
switch (scheduler_id) { |
case FSF_POSIX: |
245,18 → 220,13 |
budget = EDFSTAR_getbudget(local_scheduler_level, exec_shadow); |
break; |
case FSF_RM: |
budget = RMSTAR_getbudget(local_scheduler_level, exec_shadow); |
default: |
budget = -1; |
break; |
} |
|
if (budget == -1) { |
kern_frestore(f); |
return FSF_ERR_BAD_ARGUMENT; |
if (budget == -1) return FSF_ERR_BAD_ARGUMENT; |
|
} |
|
if (next_budget != NULL && next_period != NULL) { |
|
SERVER_getbudgetinfo(fsf_server_level, &Q, &T, &D, budget); |
284,10 → 254,7 |
index = (index + 1) % MAX_HASH_ENTRY; |
// find |
while (htable[index].id != synch_handle && index!=oldindex) index=(index+1) % MAX_HASH_ENTRY; |
if (index==oldindex) { |
kern_frestore(f); |
return FSF_ERR_INVALID_SYNCH_OBJ_HANDLE; |
} |
if (index==oldindex) return FSF_ERR_INVALID_SYNCH_OBJ_HANDLE; |
} |
|
if (htable[index].events > 0) { |
300,9 → 267,8 |
kern_printf("(Synch_Handle Events %d)",synch_handle->events); |
#endif |
|
kern_frestore(f); |
task_endcycle(); |
|
task_endcycle(); |
return 0; |
|
} |