Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*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, settando i campi in maniera opportuna (key e s_procQ). 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){
- int flag = TRUE;
- semd_t *semd;
- semd_t *i;
- struct list_head *j;
- struct list_head *lista = &ASL;
- /*Ricerca dell'id del descrittore del semaforo nella ASL*/
- list_for_each(j , lista){
- semd = container_of(j , semd_t , s_next);
- if ( semd->s_key == key ){
- /*..Se questo viene trovato si inscerisce p nella sua lista dei processi*/
- insertProcQ(&semd->s_procQ , p);
- flag = FALSE;
- break;
- }
- }
- /*..Se invece non viene trovato e la lista dei descrittori dei semafori liberi non e' vuota*/
- if( flag && !(list_empty(&semdFree))){
- i = container_of(list_next(&semdFree), semd_t, s_next);
- list_del(&i->s_next);
- i->s_key = key;
- p->p_semkey = key;
- INIT_LIST_HEAD(&i->s_procQ);
- INIT_LIST_HEAD(&i->s_next);
- insertProcQ(&i->s_procQ , p);
- list_add(&i->s_next, lista);
- flag = FALSE;
- }
- return flag;
- }
Add Comment
Please, Sign In to add comment