/* Se invoca al hacer read() de entrada /proc */ static ssize_t fifo_read(struct file *file, char __user *buf, size_t len, loff_t *off){ char kbuffer[MAX_CBUFFER_LEN]; if (len> MAX_CBUFFER_LEN) { return -EFAULT; } if (down_interruptible(&mtx)){ return -EINTR; } while (size_cbuffer_t(cbuffer)<len && prod_count>0){ nr_cons_waiting +=1; up(&mtx); if (down_interruptible(&sem_cons)){ return -EINTR; } } if(prod_count == 0 && size_cbuffer_t(cbuffer) == 0){ up(&mtx); return 0; } remove_items_cbuffer_t(cbuffer,kbuffer,len); if(nr_prod_waiting > 0){ up(&sem_prod); nr_prod_waiting -=1; } up(&mtx); if (copy_to_user(buf,kbuffer,len)) { return -EFAULT; } return len; }
int remove_cbuffer_t_batch(cbuffer_t* cbuffer, char* items, int max_nr_items) { /* Check the maximum number of bytes we can actually retrieve */ int nr_items=max_nr_items>cbuffer->size?cbuffer->size:max_nr_items; /* Remove items from the buffer!! */ if (nr_items) remove_items_cbuffer_t (cbuffer, items, nr_items); return nr_items; }
int fifoproc_read(const char* buff, int len) { char kbuffer[MAX_KBUF]; if(len > MAX_CBUFFER_LEN || len>MAX_KBUF) { return Error;} lock(mtx); /*Esperar hasta que haya elementos que leer*/ while(size_cbuffer_t(cbuffer)==0 && prod_count>0) { cond_wait(cons,mtx); } /*En caso de no existir productores finaliza con EOF*/ if ((prod_count==0)&&(size_cbuffer_t(cbuffer)==0)) {unlock(mtx); return 0;} /*Elimina los elementos leidos del buffer y manda una seƱal a los productores *por si alguno dormido*/ remove_items_cbuffer_t(cbuffer, kbuffer, len); cond_signal(prod); unlock(mtx); copy_to_user(buff, kbuffer, strlen(kbuffer)); return strlen(kbuffer); }