# Miscelatura di Caffe' ## Inizializzazione ``` sem mutex = 1; sem arabica = 0, robusta = 0; sem estrai = 0; const int maxArabica = 2*MAX/3 const int maxRobusta = MAX-maxArabica; const int sacco = C; int cntArabica = 0; int cntRobusta = 0; int attesaArabica = 0; int attesaRobusta = 0; int attesaEstrattori = 0; ``` ## Operai versatori ### Versatori di Arabica ``` public void versaArabica () { P (mutex); if (cntArabica == maxArabica) { V(mutex); attesaArabica++; P (arabica); attesaArabica--; } ...versa... cntArabica++; if (attesaArabica > 0 && cntArabica < maxArabica) { V(arabica); } else if (attesaRobusta > 0 && cntRobusta < maxRobusta) { V(robusta); } else if (cntRobusta == 2*cntArabica && (cntArabica +cntRobusta > sacco) && attesaEstrattori > 0) { V(estrai); } else { V(mutex); } } ``` ### Versatori di Robusta ``` public void versaRobusta () { P (mutex); if ((attesaArabica > 0 && cntArabica < maxArabica) || cntRobusta == maxRobusta) { V(mutex); attesaRobusta++; P (robusta); attesaRobusta--; } ...versa... cntRobusta++; if (attesaArabica > 0 && cntArabica < maxArabica) { V(arabica); } else if (attesaRobusta > 0 && cntRobusta < maxRobusta) { V(robusta); } else if (cntRobusta == 2*cntArabica && (cntArabica +cntRobusta > sacco) && attesaEstrattori > 0) { V(estrai); } else { V(mutex); } } ``` ## Operai insaccatori ``` public void insaccaMiscela () { P (mutex); if (!(cntRobusta == 2*cntArabica && (cntArabica +cntRobusta > sacco))) { V (mutex); attesaEstrattori++; P (estrai); attesaEstrattori--; } <...estrai...> cntRobusta = cntRobusta - sacco/3; cntArabica = cntArabica - 2*sacco/3; if (attesaArabica > 0) { V(arabica); } else if (attesaRobusta > 0) { V(robusta); } else if ((cntArabica + cntRobusta > sacco) && attesaEstrattori > 0) { V(estrai); } else { V(mutex); } } ```