Skip to content
This repository has been archived by the owner on Nov 2, 2022. It is now read-only.

Commit

Permalink
aggiunta documentazione e Fix ritorno di errori per funzioni di rimoz…
Browse files Browse the repository at this point in the history
…ione #12
  • Loading branch information
jjak0b committed May 20, 2020
1 parent beb428b commit 1c25def
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 11 deletions.
3 changes: 2 additions & 1 deletion include/scheduler/scheduler.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ int scheduler_StateToWaiting( pcb_t* p, int* semKey );
* @PreCondition Prima di chiamare questa funzione, è necessario chiamare scheduler_UpdateContext() per aggiornare il contesto del processo attuale
* @PostCondition Dopo questo stato è necessario richiamare scheduler_schedule per procedere con la schedulazione dei processi
* @return int
* * 1 se pid == NULL e non c'è alcun processo tracciato dallo scheduler in esecuzione
* * !=0 se pid == NULL o non c'è alcun processo tracciato dallo scheduler in esecuzione, o non è stato possibile trovare il processo in nessuna coda
* * 0 altrimenti se è avvenuto tutto correttamente
* @param pid identificatore del processo da terminare, se == NULL sarà considerato il processo attualmente in esecuzione
* @param b_flag_terminate_progeny Se TRUE rimuove e dealloca dalla ready queue o dalla semd wait queue il descrittore del processo in esecuzione e tutta la sua progenie,
Expand Down Expand Up @@ -156,6 +156,7 @@ int scheduler_RemoveProcess( pcb_t *p );
* @param p descrittore del processo da cui partire a rimuovere la progenie
* @return int
* * 1 Se p == NULL
* * -1 Se p non si trova in alcuna coda ( ready, wait queue, o processo corrente )
* * 0 altrimenti
*/
int scheduler_RemoveProgeny( pcb_t* p );
Expand Down
28 changes: 18 additions & 10 deletions src/scheduler/scheduler.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,11 @@ HIDDEN scheduler_t *scheduler;
* @PostCondition Se viene rimosso dalla wait queue di un semaforo, incrementa il valore del semaforo stesso, quindi il suo p_semkey diventa NULL
*
* @param p il processo da rimuovere
* @return int
* * FALSE se è p esiste in qualche coda ed è stato rimosso correttamente
* * TRUE se p == NULL oppure se p non è stato trovato
*/
void scheduler_RemoveProcessFromAnyQ( pcb_t *p );
int scheduler_RemoveProcessFromAnyQ( pcb_t *p );

void idle_entry(){ while( TRUE ) WAIT(); }

Expand Down Expand Up @@ -163,7 +166,7 @@ int scheduler_StateToWaiting( pcb_t *p, int* semKey ) {
return b_result;
}

void scheduler_RemoveProcessFromAnyQ( pcb_t *p ) {
int scheduler_RemoveProcessFromAnyQ( pcb_t *p ) {
pcb_t *removed = NULL;

if( p == scheduler->running_p ) {
Expand All @@ -183,6 +186,7 @@ void scheduler_RemoveProcessFromAnyQ( pcb_t *p ) {
else if( removed == NULL ) {
removed = outProcQ( &(scheduler->ready_queue), p );
}
return removed == NULL;
}

int scheduler_StateToTerminate( pcb_t *pid, int b_flag_terminate_progeny ) {
Expand All @@ -195,18 +199,20 @@ int scheduler_StateToTerminate( pcb_t *pid, int b_flag_terminate_progeny ) {
}
/* Lo scollego dal padre */
outChild( pid );

int b_error = FALSE;
if( b_flag_terminate_progeny ) {
scheduler_RemoveProgeny( pid );
b_error = scheduler_RemoveProgeny( pid );
}
else {
scheduler_RemoveProcessFromAnyQ( pid );
pcb_SetChildrenParent( pid, NULL );
if( pid != &scheduler->idlePcb )
freePcb( pid );
b_error = scheduler_RemoveProcessFromAnyQ( pid );
if( !b_error ){
pcb_SetChildrenParent( pid, NULL );
if( pid != &scheduler->idlePcb )
freePcb( pid );
}
}

return 0;
return b_error;
}

int scheduler_RemoveProgeny( pcb_t* p ) {
Expand All @@ -228,7 +234,9 @@ int scheduler_RemoveProgeny( pcb_t* p ) {
* e poi elimina il padre appena elaborato dallo stack per deallocarlo
*/

scheduler_RemoveProcessFromAnyQ( parent );
if( !scheduler_RemoveProcessFromAnyQ( parent ) ){
return -1;
}
list_add( &p->p_next, &pcb_stack );

while( !list_empty( &pcb_stack ) ) {
Expand Down

0 comments on commit 1c25def

Please sign in to comment.