/* message.c */ #include "message.h" #include "process.h" #include "scheduler.h" #include "string.h" #include "tty3.h" #include "types.h" int get_mess_slot(int pid) { int id = pid - 1; int i; for (i = 0; i < MESSAGE_QUEUE_SIZE; i++) { if (!PCB_list[id].messages[i].priority) { return i; } } return -1; } int get_highest_mess(int pid) { int id = pid - 1; int highest = 0; int slot = -1; int i; for (i = 0; i < MESSAGE_QUEUE_SIZE; i++) { if (PCB_list[id].messages[i].priority > highest) { highest = PCB_list[id].messages[i].priority; slot = i; } } return slot; } int send_message(char *s, int prio, int recv_pid) { int recv_id = recv_pid - 1; int mess_id = get_mess_slot(recv_pid); if (mess_id == -1) { PCB_list[recv_id].status = CRASHED; return ERROR_SEND; } else { string_memcpy(PCB_list[recv_id].messages[mess_id].data, s); PCB_list[recv_id].messages[mess_id].priority = prio; PCB_list[recv_id].messages[mess_id].receiver_pid = recv_pid; PCB_list[recv_id].messages[mess_id].sender_pid = get_running() + 1; return OK_SEND; } } int receive_message() { int pid = get_running() + 1; int start_counter = 0; while (start_counter++ < RECEIVE_WAIT_MAX) { int mess_id = get_highest_mess(pid); if (mess_id != -1) { get_message(pid, mess_id); return OK_RECEIVE; } } return RECEIVE_TIME_OUT; } void get_message(int pid, int mess_id) { int id = pid - 1; print_message(pid, mess_id); string_memcpy(PCB_list[id].current_message.data, PCB_list[id].messages[mess_id].data); PCB_list[id].current_message.priority = PCB_list[id].messages[mess_id].priority; PCB_list[id].current_message.sender_pid = PCB_list[id].messages[mess_id].sender_pid; PCB_list[id].current_message.receiver_pid = PCB_list[id].messages[mess_id].receiver_pid; erase_message(pid, mess_id); } void erase_message(int pid, int mess_id) { int id = pid - 1; string_memcpy(PCB_list[id].messages[mess_id].data, ""); PCB_list[id].messages[mess_id].priority = 0; PCB_list[id].messages[mess_id].sender_pid = 0; PCB_list[id].messages[mess_id].receiver_pid = 0; } void erase_all_messages(int pid) { int id = pid - 1; int i; for (i = 0; i < MESSAGE_QUEUE_SIZE; i++) { erase_message(pid, i); } string_memcpy(PCB_list[id].current_message.data, ""); PCB_list[id].current_message.priority = 0; PCB_list[id].current_message.sender_pid = 0; PCB_list[id].current_message.receiver_pid = 0; } void print_message(int process_pid, int message_id) { int process_id = process_pid - 1; print_int(PCB_list[process_id].messages[message_id].sender_pid); print_string(" -> "); print_int(PCB_list[process_id].messages[message_id].receiver_pid); print_string(": "); print_string(PCB_list[process_id].messages[message_id].data); NEWLINE; }