Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 333 → Rev 334

/shark/trunk/ports/first/include/fsf_contract.h
21,6 → 21,7
#include "edfstar.h"
#include "rmstar.h"
#include "posixstar.h"
#include "mpegstar.h"
 
#ifndef _FSF_CONTRACT_H_
#define _FSF_CONTRACT_H_
63,6 → 64,7
#define FSF_SCHEDULER_POSIX 0
#define FSF_SCHEDULER_EDF 1
#define FSF_SCHEDULER_RM 2
#define FSF_SCHEDULER_MPEG 3
 
// Constants for assigning default values
#define FSF_DEFAULT_WORKLOAD FSF_INDETERMINATE
/shark/trunk/ports/first/include/mpegstar.h
43,7 → 43,11
#include <sys/types.h>
#include <kernel/types.h>
 
LEVEL MPEGSTAR_register_level();
LEVEL MPEGSTAR_register_level(int master);
 
int MPEGSTAR_setbudget(LEVEL l, PID p, int budget);
int MPEGSTAR_getbudget(LEVEL l, PID p);
int MPEGSTAR_budget_has_thread(LEVEL l, int budget);
 
#endif
 
/shark/trunk/ports/first/modules/mpegstar.c
54,7 → 54,12
/*+ the level redefinition for the Round Robin level +*/
typedef struct {
level_des l; /*+ the standard level descriptor +*/
 
int server_Q;
int server_T;
 
int budget[MAX_PROC];
int scheduling_level;
 
} MPEGSTAR_level_des;
72,6 → 77,18
{
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]);
 
#ifdef MPEGSTAR_DEBUG
kern_printf("(MP:Crt:%d)",p);
#endif
if (m->pclass != NRT_PCLASS) return -1;
if (m->level != 0 && m->level != l) return -1;
proc_table[p].avail_time = lev->server_Q;
proc_table[p].wcet = lev->server_Q;
proc_table[p].control = (proc_table[p].control & ~CONTROL_CAP);
return 0; /* OK */
}
 
79,11 → 96,17
{
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]);
 
level_table[ lev->scheduling_level ] ->
private_dispatch(lev->scheduling_level, p, nostop);
 
}
 
static void MPEGSTAR_public_epilogue(LEVEL l, PID p)
{
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]);
 
level_table[ lev->scheduling_level ] ->
private_epilogue(lev->scheduling_level,p);
}
 
90,7 → 113,16
static void MPEGSTAR_public_activate(LEVEL l, PID p)
{
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]);
BUDGET_TASK_MODEL b;
budget_task_default_model(b, lev->budget[p]);
#ifdef MPEGSTAR_DEBUG
kern_printf("(MP:Act:%d:%d)",p,lev->budget[p]);
#endif
 
level_table[ lev->scheduling_level ]->
private_insert(lev->scheduling_level, p, (TASK_MODEL *)&b);
 
}
 
static void MPEGSTAR_public_unblock(LEVEL l, PID p)
114,6 → 146,9
/* Task EndCycle */
case (long)(NULL):
 
level_table[ lev->scheduling_level ]->
public_message(lev->scheduling_level, p, NULL);
 
break;
 
/* Task Disable */
141,10 → 176,11
 
/*+ Registration function:
TIME slice the slice for the Round Robin queue +*/
LEVEL MPEGSTAR_register_level()
LEVEL MPEGSTAR_register_level(int master)
{
LEVEL l; /* the level that we register */
MPEGSTAR_level_des *lev; /* for readableness only */
int i;
l = level_alloc_descriptor(sizeof(MPEGSTAR_level_des));
 
161,6 → 197,44
lev->l.public_message = MPEGSTAR_public_message;
lev->l.public_eligible = MPEGSTAR_public_eligible;
 
for (i=0;i<MAX_PROC;i++)
lev->budget[i] = NIL;
 
lev->scheduling_level = master;
 
return l;
 
}
 
int MPEGSTAR_setbudget(LEVEL l, PID p, int budget)
{
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]);
lev->budget[p] = budget;
return 0;
}
int MPEGSTAR_getbudget(LEVEL l, PID p)
{
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]);
return lev->budget[p];
}
 
int MPEGSTAR_budget_has_thread(LEVEL l, int budget)
{
MPEGSTAR_level_des *lev = (MPEGSTAR_level_des *)(level_table[l]);
int i;
for(i = 0; i< MAX_PROC; i++)
if (lev->budget[i] == budget) return 1;
return 0;
}
/shark/trunk/ports/first/first-server.c
52,6 → 52,9
case FSF_SCHEDULER_RM:
local_scheduler_level = RMSTAR_register_level(fsf_server_level);
break;
case FSF_SCHEDULER_MPEG:
local_scheduler_level = MPEGSTAR_register_level(fsf_server_level);
break;
}
*budget = SERVER_setbudget(fsf_server_level,
201,6 → 204,19
task_activate(*thread);
 
break;
case FSF_SCHEDULER_MPEG:
hard_task_def_arg(*(HARD_TASK_MODEL *)(local_scheduler_arg),arg);
hard_task_def_level(*(HARD_TASK_MODEL *)(local_scheduler_arg),local_scheduler_level);
*thread = task_create("RMSTAR", thread_code, local_scheduler_arg, NULL);
if (*thread == NIL)
return FSF_ERR_CREATE_THREAD;
MPEGSTAR_setbudget(local_scheduler_level, *thread, (int)(server));
break;
default:
return FSF_ERR_INVALID_SERVER;
break;
226,6 → 242,8
return EDFSTAR_getbudget(local_scheduler_level,thread);
case FSF_SCHEDULER_RM:
return RMSTAR_getbudget(local_scheduler_level,thread);
case FSF_SCHEDULER_MPEG:
return MPEGSTAR_getbudget(local_scheduler_level,thread);
default:
return -1;
}
271,6 → 289,14
return FSF_ERR_SERVER_USED;
 
break;
 
case FSF_SCHEDULER_MPEG:
/* Check if some thread use the server */
if(MPEGSTAR_budget_has_thread(local_scheduler_level,*server))
return FSF_ERR_SERVER_USED;
break;
 
}
 
SERVER_removebudget(fsf_server_level,*server);