Ejemplo n.º 1
0
/* 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;	
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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);
}