11,21 → 11,60 |
// S.Ha.R.K. Implementation |
//===================================================================== |
|
#include "fsf_contract.h" |
#include "fsf_configuration_parameters.h" |
#include "fsf_core.h" |
#include "fsf_server.h" |
|
#include "posixstar.h" |
#include "edfstar.h" |
#include "nonestar.h" |
#include "rmstar.h" |
|
extern int fsf_server_level; |
|
struct hash_entry { |
IQUEUE threads; |
int events; |
FSF_SYNCH_OBJ_HANDLE_T_OPAQUE id; |
}; |
|
#define MAX_HASH_ENTRY FSF_MAX_N_SYNCH_OBJECTS |
struct hash_entry htable[MAX_HASH_ENTRY]; |
|
void FSF_init_synch_obj_layer() { |
int i; |
for (i=0; i<MAX_HASH_ENTRY; i++) |
htable[i].id=-1; |
} |
|
/*----------------------------------------------------------------------*/ |
/* hash_fun() : address hash table */ |
/*----------------------------------------------------------------------*/ |
static int hash_fun(FSF_SYNCH_OBJ_HANDLE_T_OPAQUE id) |
{ |
return (id % MAX_HASH_ENTRY); |
} |
|
//#define FSF_DEBUG |
|
int |
fsf_create_synchobject(fsf_synch_object_handle_t *synch_handle) |
fsf_create_synchobject(fsf_synch_obj_handle_t *synch_handle) |
{ |
int index,oldindex; |
|
if (!synch_handle) return FSF_ERR_INVALID_SYNCH_OBJECT_HANDLE; |
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_TOO_MANY_SYNCH_OBJS; |
} |
//if (!synch_handle) return FSF_ERR_INVALID_SYNCH_OBJECT_HANDLE; |
|
iq_init(&synch_handle->threads, NULL, 0); |
synch_handle->events = 0; |
iq_init(&(htable[index].threads), NULL, 0); |
htable[index].events = 0; |
|
return 0; |
|
32,17 → 71,28 |
} |
|
int |
fsf_signal_synchobject(fsf_synch_object_handle_t *synch_handle) |
fsf_signal_synchobject(fsf_synch_obj_handle_t *synch_handle) |
{ |
|
PID p; |
int index, oldindex; |
|
if (!synch_handle) return FSF_ERR_INVALID_SYNCH_OBJECT_HANDLE; |
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; |
} |
|
//if (!synch_handle) return FSF_ERR_INVALID_SYNCH_OBJECT_HANDLE; |
|
if ((p = iq_getfirst(&synch_handle->threads)) != NIL) |
if ((p = iq_getfirst(&(htable[index].threads))) != NIL) |
task_activate(p); |
else |
synch_handle->events++; |
htable[index].events++; |
|
return 0; |
|
49,14 → 99,25 |
} |
|
int |
fsf_destroy_synchobject(fsf_synch_object_handle_t *synch_handle) |
fsf_destroy_synchobject(fsf_synch_obj_handle_t *synch_handle) |
{ |
int index, oldindex; |
|
if (!synch_handle) return FSF_ERR_INVALID_SYNCH_OBJECT_HANDLE; |
index=hash_fun(*synch_handle); |
|
while (iq_getfirst(&synch_handle->threads) != NIL); |
synch_handle->events = 0; |
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; |
} |
|
//if (!synch_handle) return FSF_ERR_INVALID_SYNCH_OBJECT_HANDLE; |
|
while (iq_getfirst(&(htable[index].threads)) != NIL); |
htable[index].events = 0; |
|
return 0; |
|
} |
78,16 → 139,16 |
if (proc_table[exec_shadow].task_level != local_scheduler_level) return 0; |
|
switch (scheduler_id) { |
case FSF_SCHEDULER_POSIX: |
case FSF_POSIX: |
budget = POSIXSTAR_getbudget(local_scheduler_level, exec_shadow); |
break; |
case FSF_SCHEDULER_EDF: |
case FSF_EDF: |
budget = EDFSTAR_getbudget(local_scheduler_level, exec_shadow); |
break; |
case FSF_SCHEDULER_NONE: |
case FSF_NONE: |
budget = NONESTAR_getbudget(local_scheduler_level, exec_shadow); |
break; |
case FSF_SCHEDULER_RM: |
case FSF_RM: |
budget = RMSTAR_getbudget(local_scheduler_level, exec_shadow); |
break; |
|
136,7 → 197,7 |
|
int |
fsf_schedule_next_event_triggered_job |
(fsf_synch_object_handle_t *synch_handle, |
(fsf_synch_obj_handle_t *synch_handle, |
struct timespec *next_budget, |
struct timespec *next_period, |
bool *was_deadline_missed, |
144,6 → 205,7 |
{ |
|
TIME T,Q,D; |
int index,oldindex; |
int budget, local_scheduler_level, scheduler_id; |
|
local_scheduler_level = SERVER_get_local_scheduler_level_from_pid(fsf_server_level, exec_shadow); |
152,13 → 214,13 |
if (proc_table[exec_shadow].task_level != local_scheduler_level) return 0; |
|
switch (scheduler_id) { |
case FSF_SCHEDULER_POSIX: |
case FSF_POSIX: |
budget = POSIXSTAR_getbudget(local_scheduler_level, exec_shadow); |
break; |
case FSF_SCHEDULER_EDF: |
case FSF_EDF: |
budget = EDFSTAR_getbudget(local_scheduler_level, exec_shadow); |
break; |
case FSF_SCHEDULER_RM: |
case FSF_RM: |
default: |
budget = -1; |
break; |
185,12 → 247,22 |
*was_deadline_missed = false; |
if (was_budget_overran != NULL) |
*was_budget_overran = false; |
|
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; |
} |
|
if (synch_handle->events > 0) { |
if (htable[index].events > 0) { |
task_activate(exec_shadow); |
synch_handle->events--; |
htable[index].events--; |
} else |
iq_insertlast(exec_shadow,&synch_handle->threads); |
iq_insertlast(exec_shadow,&(htable[index].threads)); |
|
#ifdef FSF_DEBUG |
kern_printf("(Synch_Handle Events %d)",synch_handle->events); |