Beispiel #1
0
Datei: asl.c Projekt: emulk/SOS
/*[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;   
}
Beispiel #2
0
/*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;
		}	
}