// Method pased to ListMap on clock tick // decrements the number of ticks remaining for each proc that is waiting from Delay void DecrementTicksRemaining(void *_proc) { TracePrintf(TRACE_LEVEL_FUNCTION_INFO, ">>> DecrementTicksRemaining(%p)\n", _proc); PCB *proc = (PCB *) _proc; --proc->clock_ticks_until_ready; if (proc->clock_ticks_until_ready <= 0) { TracePrintf(TRACE_LEVEL_FUNCTION_INFO, ">>> DecrementTicksRemaining: proc %p done waiting!\n", _proc); ListRemoveById(clock_block_procs, proc->pid); ListAppend(ready_queue, proc, proc->pid); } TracePrintf(TRACE_LEVEL_FUNCTION_INFO, "<<< DecrementTicksRemaining()\n"); }
void TrapTtyTransmit(UserContext *user_context) { TracePrintf(TRACE_LEVEL_FUNCTION_INFO, ">>> TrapTtyTransmit(%p)\n", user_context); int tty_id = user_context->code; Tty term = ttys[tty_id]; assert(!ListEmpty(term.waiting_to_transmit)); // Get the currently transmitting proc (always at the front of the list) PCB *waiting_proc = (PCB *) ListPeak(term.waiting_to_transmit); if (waiting_proc->tty_transmit_len > TERMINAL_MAX_LINE) { // not completely transmitted, so handle pointer stuff and leave in // front of the queue waiting_proc->tty_transmit_pointer += TERMINAL_MAX_LINE; waiting_proc->tty_transmit_len -= TERMINAL_MAX_LINE; // transmit min(MAX_LINE, len) if (TERMINAL_MAX_LINE > waiting_proc->tty_transmit_len) { TtyTransmit(tty_id, waiting_proc->tty_transmit_pointer, waiting_proc->tty_transmit_len); } else { TtyTransmit(tty_id, waiting_proc->tty_transmit_pointer, TERMINAL_MAX_LINE); } return; } // transmission complete // since done, take off transmitting list ListRemoveById(term.waiting_to_transmit, waiting_proc->pid); ListAppend(ready_queue, waiting_proc, waiting_proc->pid); free(waiting_proc->tty_transmit_buffer); if (ListEmpty(term.waiting_to_transmit)) { return; // no other procs waiting on this term } // Get the next proc waiting to submit PCB *next_to_transmit = (PCB *) ListPeak(term.waiting_to_transmit); // transmit min(MAX_LINE, len) if (TERMINAL_MAX_LINE > next_to_transmit->tty_transmit_len) { TtyTransmit(tty_id, next_to_transmit->tty_transmit_pointer, next_to_transmit->tty_transmit_len); } else { TtyTransmit(tty_id, next_to_transmit->tty_transmit_pointer, TERMINAL_MAX_LINE); } TracePrintf(TRACE_LEVEL_FUNCTION_INFO, "<<< TrapTtyTransmit(%p)\n", user_context); }
void *udp_listener(void *arg) { char tipke_hostname[MAX_BUFF], tipke_port[MAX_BUFF]; int server_socket; int ack, floor; struct message_t msg; struct sockaddr client; socklen_t client_l = sizeof(client); ParseHostnameAndPort("TIPKE", (char **) &tipke_hostname, (char **) &tipke_port); #ifdef DEBUG printf("Listening as TIPKE on %s:%s\n", tipke_hostname, tipke_port); #endif server_socket = InitUDPServer(tipke_port); #ifdef DEBUG printf("Server started successfully\n"); #endif while (RUNNING) { /* waiting for next datagram */ recvfrom(server_socket, &msg, sizeof(msg), 0, &client, &client_l); switch(msg.type) { case POTVRDA: /* received ack */ pthread_mutex_lock(&m_datagram_list); sscanf(msg.data, "%d", &ack); #ifdef DEBUG printf("Received ACK for message %d\n", ack); #endif ListRemoveById(&datagram_list, ack); pthread_mutex_unlock(&m_datagram_list); break; case TIPKE_PALI_LAMPICU_UP: send_ack(msg.id, upr_socket, &upr_server, upr_server_l); pthread_mutex_lock(&m_status); sscanf(msg.data, "%d", &floor); status[floor][D_UP] = 1; pthread_mutex_unlock(&m_status); PrintStatus(); break; case TIPKE_PALI_LAMPICU_DOWN: send_ack(msg.id, upr_socket, &upr_server, upr_server_l); pthread_mutex_lock(&m_status); sscanf(msg.data, "%d", &floor); status[floor][D_DOWN] = 1; pthread_mutex_unlock(&m_status); PrintStatus(); break; case TIPKE_GASI_LAMPICU_UP: send_ack(msg.id, upr_socket, &upr_server, upr_server_l); pthread_mutex_lock(&m_status); sscanf(msg.data, "%d", &floor); status[floor][D_UP] = 0; pthread_mutex_unlock(&m_status); PrintStatus(); break; case TIPKE_GASI_LAMPICU_DOWN: send_ack(msg.id, upr_socket, &upr_server, upr_server_l); pthread_mutex_lock(&m_status); sscanf(msg.data, "%d", &floor); status[floor][D_DOWN] = 0; pthread_mutex_unlock(&m_status); PrintStatus(); break; case TIPKE_STATUS_REQUEST: send_ack(msg.id, upr_socket, &upr_server, upr_server_l); msg.id = GetNewMessageID(); msg.type = TIPKE_STATUS_REPORT; ClockGetTime(&msg.timeout); ClockAddTimeout(&msg.timeout, TIMEOUT); pthread_mutex_lock(&m_datagram_list); sendto(upr_socket, &msg, sizeof(msg), 0, &upr_server, upr_server_l); ListInsert(&datagram_list, msg); pthread_mutex_unlock(&m_datagram_list); break; default: warnx("Unknown message!"); break; } } CloseUDPServer(server_socket); #ifdef DEBUG printf("Server closed successfully\n"); #endif return NULL; }