Exemplo n.º 1
0
int fifoproc_write(char* buff, int len) {
	char kbuffer[MAX_KBUF];

	if(len > MAX_CBUFFER_LEN || len>MAX_KBUF) { return Error;}
	if(copy_from_user(kbuffer, buff, len)) {return Error;}

	lock(mtx);
		/*Esperar hasta que haya hueco para insertar (debe haber consumidores)*/
		while(nr_gaps_cbuffer_t(cbuffer)<len && cons_count>0) {
			cond_wait(prod,mtx);
		}

		/*Detectar fin de comunicacion por error (consumidor cierrar FIFO antes)*/
		if (cons_count==0) {unlock(mtx); return -EPIPE;}

		insert_items_cbuffer_t(cbuffer,kbuffer,len);

		/*Despertar a posible consumidor bloqueado*/
		cond_signal(cons);
	unlock(mtx);
	return len;
}
Exemplo n.º 2
0
/* Se invoca al hacer write() de entrada /proc */
static ssize_t fifo_write(struct file *file, const char __user *buf, size_t len, loff_t *off){
	
	char kbuffer[MAX_CBUFFER_LEN];
	
	if(len > MAX_CBUFFER_LEN ){ 
		return -EFAULT;
	}
	if (copy_from_user(kbuffer,buf,len)) {
		return -EFAULT;
	}
	if (down_interruptible(&mtx)){
		return -EINTR;
	}
	/* Esperar hasta que haya hueco para insertar (debe haber consumidores) */
	while (nr_gaps_cbuffer_t(cbuffer)<len && cons_count>0){
		nr_prod_waiting +=1;
		up(&mtx);
		if (down_interruptible(&sem_prod)){
			return -EINTR;
		}	
	}
	
	/* Detectar fin de comunicación por error (consumidor cierra FIFO antes) */
	if (cons_count==0) {
		up(&mtx); 
		return -EPIPE;
	}
	
	insert_items_cbuffer_t(cbuffer,kbuffer,len);
	/* Despertar a posible consumidor bloqueado */
	if(nr_cons_waiting > 0){
		up(&sem_cons);
		nr_cons_waiting -=1;
	}
	up(&mtx);
	return len;

}