void _read(unsigned int *task, unsigned int **tasks, size_t task_count, struct pipe_ringbuffer *pipes) { task[-1] = TASK_READY; /* If the fd is invalid, or trying to read too much */ if(task[2+0] > PIPE_LIMIT || task[2+2] > PIPE_BUF) { task[2+0] = -1; } else { struct pipe_ringbuffer *pipe = &pipes[task[2+0]]; if((size_t)PIPE_LEN(*pipe) < task[2+2]) { /* Trying to read more than there is: block */ task[-1] = TASK_WAIT_READ; } else { size_t i; char *buf = (char*)task[2+1]; /* Copy data into buf */ for(i = 0; i < task[2+2]; i++) { PIPE_POP(*pipe,buf[i]); } /* Unblock any waiting writes XXX: nondeterministic unblock order */ for(i = 0; i < task_count; i++) { if(tasks[i][-1] == TASK_WAIT_WRITE) { _write(tasks[i], tasks, task_count, pipes); } } } } }
int mq_read (struct pipe_ringbuffer *pipe, struct task_control_block *task) { size_t msg_len; size_t i; char *buf = (char*)task->stack->r1; /* Get length */ for (i = 0; i < 4; i++) { PIPE_POP(*pipe, *(((char*)&msg_len)+i)); } /* Copy data into buf */ for (i = 0; i < msg_len; i++) { PIPE_POP(*pipe, buf[i]); } return msg_len; }
int fifo_read (struct pipe_ringbuffer *pipe, struct task_control_block *task) { size_t i; char *buf = (char*)task->stack->r1; /* Copy data into buf */ for (i = 0; i < task->stack->r2; i++) { PIPE_POP(*pipe, buf[i]); } return task->stack->r2; }