Example #1
0
/* 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;
}
Example #2
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);
}