Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 858 → Rev 868

/shark/trunk/ports/first/first-sync.c
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);