int mq_write (struct pipe_ringbuffer *pipe, struct task_control_block *task) { size_t i; const char *buf = (const char*)task->stack->r1; /* Copy count into pipe */ for (i = 0; i < sizeof(size_t); i++) PIPE_PUSH(*pipe,*(((char*)&task->stack->r2)+i)); /* Copy data into pipe */ for (i = 0; i < task->stack->r2; i++) PIPE_PUSH(*pipe,buf[i]); return task->stack->r2; }
void _write(unsigned int *task, unsigned int **tasks, size_t task_count, struct pipe_ringbuffer *pipes) { /* If the fd is invalid or the write would be non-atomic */ 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_BUF - PIPE_LEN(*pipe) < task[2+2]) { /* Trying to write more than we have space for: block */ task[-1] = TASK_WAIT_WRITE; } else { size_t i; const char *buf = (const char*)task[2+1]; /* Copy data into pipe */ for(i = 0; i < task[2+2]; i++) { PIPE_PUSH(*pipe,buf[i]); } /* Unblock any waiting reads XXX: nondeterministic unblock order */ for(i = 0; i < task_count; i++) { if(tasks[i][-1] == TASK_WAIT_READ) { _read(tasks[i], tasks, task_count, pipes); } } } } }
int fifo_write (struct pipe_ringbuffer *pipe, struct task_control_block *task) { size_t i; const char *buf = (const char*)task->stack->r1; /* Copy data into pipe */ for (i = 0; i < task->stack->r2; i++) PIPE_PUSH(*pipe,buf[i]); return task->stack->r2; }