Ejemplo n.º 1
0
// 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");
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
Archivo: tipke.c Proyecto: msantl/SZRSV
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;
}