void TrapTtyRecieve(UserContext *user_context) { TracePrintf(TRACE_LEVEL_FUNCTION_INFO, ">>> TrapTtyRecieve(%p)\n", user_context); int tty_id = user_context->code; // Find the proper terminal struct Tty term = ttys[tty_id]; if (ListEmpty(term.waiting_to_receive)) { // no waiting procs, so create line buffer and // add to list LineBuffer *lb = calloc(1, sizeof(LineBuffer)); lb->buffer = calloc(TERMINAL_MAX_LINE, sizeof(char)); lb->length = TtyReceive(tty_id, lb->buffer, TERMINAL_MAX_LINE); ListEnqueue(term.line_buffers, lb, 0); } else { // at least one proc waiting // create heap in kernel to use char *input = calloc(TERMINAL_MAX_LINE, sizeof(char)); char *input_ptr = input; // point how far into the buffer we've read int input_length = TtyReceive(tty_id, input, TERMINAL_MAX_LINE); int input_remaining = input_length; // Continue so long as procs are waiting and there is unconsumed input while (!ListEmpty(term.waiting_to_receive) && input_remaining > 0) { PCB *waiting_proc = (PCB *) ListDequeue(term.waiting_to_receive); assert(waiting_proc->tty_receive_buffer); // put proc back into ready queue ListAppend(ready_queue, waiting_proc, waiting_proc->pid); if (input_remaining <= waiting_proc->tty_receive_len) { // Consuming all the input memcpy(waiting_proc->tty_receive_buffer, input_ptr, input_remaining); waiting_proc->tty_receive_len = input_remaining; input_remaining = 0; } else { // Only consuming some of the input memcpy(waiting_proc->tty_receive_buffer, input_ptr, waiting_proc->tty_receive_len); input_remaining -= waiting_proc->tty_receive_len; input_ptr += waiting_proc->tty_receive_len; } } // Check if there is still input left after all the procs have been filled if (input_remaining > 0) { // Create new line buffer and store char *remaining_buff = calloc(input_remaining, sizeof(char)); memcpy(remaining_buff, input_ptr, input_remaining); LineBuffer *lb = calloc(1, sizeof(LineBuffer)); lb->buffer = remaining_buff; lb->length = input_remaining; ListEnqueue(term.line_buffers, lb, 0); } free(input); } TracePrintf(TRACE_LEVEL_FUNCTION_INFO, "<<< TrapTtyRecieve(%p)\n", user_context); }
/* Reading process read buf */ void tty_reading_wake_up(unsigned int tty_id) { pcb_t *pcb; int chars_get; pcb = tty_reading_procs[tty_id]; chars_get = TtyReceive(tty_id, pcb -> tty_buf, pcb -> exit_code); pcb -> exit_code = chars_get; //pcb_wake_up(pcb); return; }