Guest User

Untitled

a guest
Jun 21st, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.34 KB | None | 0 0
  1. /*Viene inserito il PCB puntato da p nella coda dei processi bloccati associata al SEMD con chiave key
  2. Se il semaforo corrispondente non è presente nella ASL alloca un nuovo SEMD dalla lista di quelli liberi (semdFree)
  3. e lo inserisce nella ASL, settando i campi in maniera opportuna (key e s_procQ). Se non è possibile allocare un nuovo
  4. SEMD perchè la lista di quelli liberi è vuota, restituisce TRUE. In tutti gli altri casi restituisce FALSE. */
  5.  
  6. int insertBlocked(int key, pcb_t *p){
  7.  
  8. int flag = TRUE;
  9.  
  10.     semd_t *semd;
  11.  
  12.     semd_t *i;
  13.     struct list_head *j;
  14.     struct list_head *lista = &ASL;
  15.  
  16.     /*Ricerca dell'id del descrittore del semaforo nella ASL*/
  17.    
  18.     list_for_each(j , lista){
  19.         semd = container_of(j , semd_t , s_next);
  20.         if ( semd->s_key == key ){
  21.    
  22.     /*..Se questo viene trovato si inscerisce p nella sua lista dei processi*/
  23.    
  24.             insertProcQ(&semd->s_procQ , p);
  25.             flag = FALSE;
  26.             break;
  27.         }
  28.     }
  29.     /*..Se invece non viene trovato e la lista dei descrittori dei semafori liberi non e' vuota*/
  30.    
  31.     if( flag && !(list_empty(&semdFree))){
  32.         i = container_of(list_next(&semdFree), semd_t, s_next);
  33.         list_del(&i->s_next);
  34.         i->s_key = key;
  35.         p->p_semkey = key;
  36.         INIT_LIST_HEAD(&i->s_procQ);
  37.         INIT_LIST_HEAD(&i->s_next);
  38.         insertProcQ(&i->s_procQ , p);
  39.         list_add(&i->s_next, lista);
  40.  
  41.         flag = FALSE;
  42.     }
  43.        
  44.  
  45.     return flag;
  46.  
  47. }
Add Comment
Please, Sign In to add comment