40,25 → 40,25 |
/*----------------------------------------------------------------------*/ |
/* hash_fun() : address hash table */ |
/*----------------------------------------------------------------------*/ |
static int hash_fun(FSF_SYNCH_OBJ_HANDLE_T_OPAQUE id) |
static int hash_fun(FSF_SYNCH_OBJ_HANDLE_T_OPAQUE *id) |
{ |
return (id % MAX_HASH_ENTRY); |
return ((int)id % MAX_HASH_ENTRY); |
} |
|
//#define FSF_DEBUG |
|
int |
fsf_create_synchobject(fsf_synch_obj_handle_t *synch_handle) |
fsf_create_synch_obj(fsf_synch_obj_handle_t *synch_handle) |
{ |
int index,oldindex; |
|
index=hash_fun(*synch_handle); |
index=hash_fun(synch_handle); |
|
if (htable[index].id!=*synch_handle) { |
if (htable[index].id!=1) { |
oldindex=index; |
index = (index + 1) % MAX_HASH_ENTRY; |
// find |
while (htable[index].id != *synch_handle && index!=oldindex) index=(index+1) % MAX_HASH_ENTRY; |
while (htable[index].id != 1 && index!=oldindex) index=(index+1) % MAX_HASH_ENTRY; |
if (index==oldindex) return FSF_ERR_TOO_MANY_SYNCH_OBJS; |
} |
//if (!synch_handle) return FSF_ERR_INVALID_SYNCH_OBJECT_HANDLE; |
65,6 → 65,8 |
|
iq_init(&(htable[index].threads), NULL, 0); |
htable[index].events = 0; |
htable[index].id = 1; |
*synch_handle=index; |
|
return 0; |
|
71,28 → 73,20 |
} |
|
int |
fsf_signal_synchobject(fsf_synch_obj_handle_t *synch_handle) |
fsf_signal_synch_obj(fsf_synch_obj_handle_t synch_handle) |
{ |
|
PID p; |
int index, oldindex; |
int index=synch_handle; |
fsf_server_id_t server; |
SYS_FLAGS f; |
f=kern_fsave(); |
|
index=hash_fun(*synch_handle); |
|
if (htable[index].id!=*synch_handle) { |
oldindex=index; |
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 (htable[index].id==-1) { |
kern_frestore(f); |
return FSF_ERR_INVALID_SYNCH_OBJ_HANDLE; |
} |
|
|
//if (!synch_handle) return FSF_ERR_INVALID_SYNCH_OBJECT_HANDLE; |
|
if ((p = iq_getfirst(&(htable[index].threads))) != NIL) { |
109,18 → 103,14 |
} |
|
int |
fsf_destroy_synchobject(fsf_synch_obj_handle_t *synch_handle) |
fsf_destroy_synch_obj(fsf_synch_obj_handle_t synch_handle) |
{ |
int index, oldindex; |
|
index=hash_fun(*synch_handle); |
|
if (htable[index].id!=*synch_handle) { |
oldindex=index; |
index = (index + 1) % MAX_HASH_ENTRY; |
// find |
while (htable[index].id != *synch_handle && index!=oldindex) index=(index+1) % MAX_HASH_ENTRY; |
if (index==oldindex) return FSF_ERR_INVALID_SYNCH_OBJ_HANDLE; |
int index=synch_handle; |
SYS_FLAGS f; |
f=kern_fsave(); |
if (htable[index].id==-1) { |
kern_frestore(f); |
return FSF_ERR_INVALID_SYNCH_OBJ_HANDLE; |
} |
|
//if (!synch_handle) return FSF_ERR_INVALID_SYNCH_OBJECT_HANDLE; |
232,7 → 222,7 |
{ |
|
TIME T,Q,D; |
int index,oldindex; |
int index=synch_handle; |
int budget, local_scheduler_level, scheduler_id; |
fsf_server_id_t server; |
SYS_FLAGS f; |
244,7 → 234,7 |
|
if (proc_table[exec_shadow].task_level != local_scheduler_level) { |
kern_frestore(f); |
return 0; |
return FSF_ERR_BAD_ARGUMENT; |
} |
|
switch (scheduler_id) { |
256,6 → 246,9 |
break; |
case FSF_RM: |
budget = RMSTAR_getbudget(local_scheduler_level, exec_shadow); |
case FSF_NONE: |
budget = NONESTAR_getbudget(local_scheduler_level, exec_shadow); |
break; |
default: |
budget = -1; |
break; |
287,19 → 280,102 |
if (was_budget_overran != NULL) |
*was_budget_overran = false; |
|
index=hash_fun(synch_handle); |
if (htable[index].id==-1) { |
kern_frestore(f); |
return FSF_ERR_INVALID_SYNCH_OBJ_HANDLE; |
} |
|
if (htable[index].id!=synch_handle) { |
oldindex=index; |
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 (htable[index].events > 0) { |
task_activate(exec_shadow); |
htable[index].events--; |
} else { |
fsf_get_server(exec_shadow, &server); |
fsf_settask_nopreemptive(&server, exec_shadow); |
iq_insertlast(exec_shadow,&(htable[index].threads)); |
} |
|
#ifdef FSF_DEBUG |
kern_printf("(Synch_Handle Events %d)",synch_handle->events); |
#endif |
|
kern_frestore(f); |
|
task_endcycle(); |
return 0; |
|
} |
|
int fsf_timed_schedule_triggered_job(fsf_synch_obj_handle_t synch_handle, |
const struct timespec * abs_timeout, |
bool * timed_out, |
struct timespec * next_budget, |
struct timespec * next_period, |
bool * was_deadline_missed, |
bool * was_budget_overran) { |
TIME T,Q,D; |
int index=synch_handle; |
int budget, local_scheduler_level, scheduler_id; |
fsf_server_id_t server; |
int timed_out; |
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; |
} |
|
switch (scheduler_id) { |
case FSF_POSIX: |
budget = POSIXSTAR_getbudget(local_scheduler_level, exec_shadow); |
break; |
case FSF_EDF: |
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 (next_budget != NULL && next_period != NULL) { |
|
SERVER_getbudgetinfo(fsf_server_level, &Q, &T, &D, budget); |
|
#ifdef FSF_DEBUG |
kern_printf("(budget %d Q=%d T=%d)",budget,(int)Q,(int)T); |
#endif |
|
next_budget->tv_sec = Q / 1000000; |
next_budget->tv_nsec = (Q % 1000000) * 1000; |
next_period->tv_sec = T / 1000000; |
next_period->tv_nsec = (T % 1000000) * 1000; |
|
} |
|
if (was_deadline_missed != NULL) |
*was_deadline_missed = false; |
if (was_budget_overran != NULL) |
*was_budget_overran = false; |
|
|
if (htable[index].id==-1) { |
kern_frestore(f); |
return FSF_ERR_INVALID_SYNCH_OBJ_HANDLE; |
} |
|
|
if (htable[index].events > 0) { |
task_activate(exec_shadow); |
htable[index].events--; |
307,6 → 383,7 |
fsf_get_server(exec_shadow, &server); |
fsf_settask_nopreemptive(&server, exec_shadow); |
iq_insertlast(exec_shadow,&(htable[index].threads)); |
//kern_event_post(ats_timeout, (void (*)(void *))restart_task, (void *)(exec_shadow)); |
} |
|
#ifdef FSF_DEBUG |
318,4 → 395,4 |
task_endcycle(); |
return 0; |
|
} |
}; |