/* Se invoca al hacer close() de entrada /proc */ static int fifo_release(struct inode *inode, struct file *file){ if (down_interruptible(&mtx)){ return -EINTR; } if(file->f_mode & FMODE_READ){ cons_count -=1; //cond_signal(prod) if(nr_prod_waiting > 0){ up(&sem_prod); nr_prod_waiting -=1; } }else{ prod_count -=1; //cond_signal(cons) if(nr_cons_waiting > 0){ up(&sem_cons); nr_cons_waiting -=1; } } if(prod_count == 0 && cons_count == 0) clear_cbuffer_t(cbuffer); up(&mtx); return 0; }
/* *Cierra un /proc en el modo especificado por el parametro de entrada *bool lectura ==> 1 cierra en modo lectura, 0 cierra en modo escritura */ void fifoproc_release(bool lectura) { lock(mtx); /*Si queremos cerrar un fichero en modo lectura, reducimos *el numero de consumidores en una unidad y, en caso de que *ya no existan productores, limpiamos el buffer*/ if(lectura) { cons_count--; cond_signal(prod); } /*Si queremos cerrar un fichero en modo escritura, reducimos *el numero de productores en una unidad y, en caso de que *ya no existan consumidores, limpiamos el buffer*/ else { prod_count--; cond_signal(cons); } if((prod_count ==0) && (cons_count ==0)) clear_cbuffer_t(cbuffer); unlock(mtx); }