Advertisement
Guest User

Untitled

a guest
May 24th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.94 KB | None | 0 0
  1. ## Testo ##
  2. Scrivere il monitor altcolbb. Il monitor deve implementare le seguenti procedure entry:
  3.   void write(color_t color, generic_type val);
  4.   generic_type read(void);
  5.  
  6. Esistono elementi di due colori diversi, rosso e blu.
  7. Altcolbb deve implementare un buffer limitato con la particolarità che gli elementi devono essere inseriti nel
  8. buffer (fino a un numero massimo MAX) a colori alternati:
  9. se l''ultimo elemento nel buffer è rosso il prossimo deve essere blu e viceversa.
  10. Quando il buffer è vuoto il primo elemento inserito puo essere sia rosso sia blu.
  11.  
  12.  
  13. ## Svolgimento ##
  14.  
  15. monitor altcolbb{
  16.     condition ok2goR;
  17.     condition ok2goB;
  18.     element buffer[MAX];
  19.     int current_pos;
  20.  
  21.     procedure entry void write(color_t color, generic_type val){
  22.  
  23.         if ((current_pos > MAX) || ((current_pos != -1) && (buffer[current_pos].color == color))){
  24.             if (color == Red){ ok2goR.wait();} //Se l'elemento è rosso
  25.             else { ok2goB.wait();} //Se l'elemento è blu
  26.         }
  27.  
  28.         current_pos ++;
  29.         buffer[current_pos].color = color;
  30.         buffer[current_pos].contenent = val;
  31.  
  32.         if (color == Red) {ok2goB.signal();}//se si possono aggiungere elementi blu
  33.         else {ok2goR.signal();}//se si possono aggiungere elementi rossi
  34.     }
  35.  
  36.     procedure entry generic_type read(void){
  37.         if (current_pos > 0){
  38.             element tmp = buffer[current_pos];
  39.             current_pos --;
  40.  
  41.             if (current_pos == -1){
  42.                 if (random(0,1)){ok2goR.signal();}
  43.                 else {ok2goB.signal();}
  44.             }
  45.             else if (buffer[current_pos].color == Red){ ok2goR.signal();}
  46.             else { ok2goB.signal();}
  47.  
  48.             return tmp;
  49.         }
  50.         else {
  51.             return NULL;
  52.         }
  53.     }
  54.  
  55.     altcolbb (){
  56.       int current_pos = -1;//Se current_pos sta a -1 significa che il buffer è vuoto, altrimenti segna il buffer massimo corrente
  57.     }
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement