#include #include #include #include #include "adder.h" #include "mailbox.h" /** * Read all of the values from the given mailbox id and then send it back to mailbox 0. * * @param raw_mailbox_id A ponter to an integer holding the mailbox id this thread should read from. * @return void* Returns a pointer to a return code. -1 on error, 0 otherwise. Must be freed by caller. */ void *adder(void *raw_mailbox_id) { int mailbox_id = *(int*)(raw_mailbox_id); // If we're thread 0, we shouldn't be running adder. // Any thread id below 0 is invalid. if (mailbox_id <= 0) { int *ret_val = malloc(sizeof(int)); *ret_val = -1; return ret_val; } int num_messages = 0; int total_value = 0; int start_time = time(NULL); struct msg message; while (true) { int recv_result = RecvMsg(mailbox_id, &message); if (recv_result != 0) { int *ret_val = malloc(sizeof(int)); *ret_val = -1; return ret_val; } // If we have a negative value, we're done receiving messages. if (message.value < 0) { break; } num_messages++; total_value += message.value; sleep(1); } int end_time = time(NULL); struct msg res_mesage = { .iFrom = mailbox_id, .value = total_value, .cnt = num_messages, .tot = end_time - start_time, }; int send_result = SendMsg(0, &res_mesage); if (send_result < 0) { int *ret_val = malloc(sizeof(int)); *ret_val = -1; return ret_val; } int *ret_val = malloc(sizeof(int)); *ret_val = 0; return ret_val; }