/*[3] * Viene inserito il PCB puntato da p nella coda dei processi bloccati associata al SEMD con chiave key. Se il semaforo corrispondente non e’ presente nella ASL, alloca un nuovo SEMD dalla lista di quelli liberi (semdFree) e lo inserisce nella ASL, settando I campi in maniera opportuna. Se non e’ possibile allocare un nuovo SEMD perche’ la lista di quelli liberi e’ vuota, restituisce TRUE. In tutti gli altri casi, restituisce FALSE. */ int insertBlocked(int *key, pcb_t* p) { semd_t *tmp; p->p_next=NULL; tmp = getSemd(key); /*se il semaforo non esiste*/ if (tmp == NULL) { /**/ tmp = allocSem(); /*se la lista dei semd liberi e vuota*/ if (tmp == NULL){ return TRUE; } tmp->s_key = key; insert(&semd_h, tmp); p->p_semkey = key; insertProcQ(&(tmp->s_procQ), p); } else insertProcQ(&(tmp->s_procQ), p); return FALSE; }
/*Viene inserito il PCB puntato da p nella coda dei processi bloccati associata al SEMD con chiave key. Se il semaforo corrispondente non è presente nella ASL, alloca un nuovo SEMD dalla lista di quelli liberi (semdFree) e lo inserisce nella ASL. Se non è possibile allocare un nuovo SEMD perchè la lista di quelli liberi è vuota, restituisce TRUE. In tutti gli altri casi,restituisce FALSE*/ int insertBlocked(int *key, pcb_t* p){ semd_t *semd_target = getSemd(key); if(semd_target == NULL){ /*Il semaforo non esiste nella ASL*/ semd_target = allocSem(); /*semd_target ora punta al SEMD tolto dalla semdFree. Se semdFree è vuota, semd_target == NULL*/ if (semd_target == NULL) /*Se la semdFree è vuota restituisco TRUE*/ return TRUE; semd_target->s_key = key; insertSEMList(&semd_h, semd_target); /*Alloco semd_target nella ASL*/ p->p_semkey = key; if(*key <= 0) insertProcQ(&(semd_target->s_procQ), p); /*Inserisco p nella coda di processi bloccati di semd_target*/ return FALSE; } else{ /*Il semaforo esiste già nella ASL*/ insertProcQ(&(semd_target->s_procQ), p); p->p_semkey = key; return FALSE; } }