secondo noi no, succede casino.
Quindi
- si modifica la ptask_init() aggiungendo un parametro per specificare il protocollo, PI o PC o SEM.
- Il semaforo interno per la struttura _tp_mutex va creato del tipo giusto.
Si aggiunge un ulteriore parametro GLOBAL, PARTITIONED
Se GLOBAL, si usa lo scheduler di Linux normalmente.
Se PARTITIONED, ogni volta che si crea un task, si setta l’affinità a un processore (per default, 0)
- ptask_
- pt_
- task_
- ptime è un intero, senza unità
- internamente, per massima precisione, tspec
- period
- priority
- wait_flag
o lo creo senza farlo partire per attivarlo successivamente oppure lo creo facendolo partire immediatamente.
ACT –> IMMEDIATE (default) NO_ACT –> DEFERRED
unificare la wait_for_period() e la wait_for_activation(), adesso solo la seconda che decide cosa fare a seconda del “tipo” del task
- nella struttura interna, devo avere un campo “tipo”.
- posso impostare il tipo dinamicamente con una funzione set_type()
- alla creazione aggiungo un parametro nella funzione
int idx = task_create(body, tipo, periodo, priorità, other_params);
seguire pthread, fare funzioni addizionali per cambiare i parametri esempio:
pt_init_rdline(p, rd);
per i flag, aggiungere _flag in fondo al nome
alcuni parametri si possono cambiare:
void pt_set_period(taskid, val); void pt_set_priority(taskid, val);
e funzioni per ritornare il valore attuale
int pt_get_period(taskid); int pt_get_priority(taskid);
- cancellare wcet e funzioni relative
- aggiungere un flag nella struttura dati, che ci dice se l’ultima istanza del task ha mancato la deadline.
- fare in modo che la funzione deadline_miss si possa chiamare solo da dentro il task.
da fare
ptask_activate_at(taskid, abstime);
quando si sveglia dal semaforo, fa una clock_nanosleep() per vedere cosa fare. (serve un ulteriore flag o qualcosa di simile nella task_struct)
(there is no reason to put them outside)
(easier to document and to understand)