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; }
/* 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; }