64 lines
1.5 KiB
C
64 lines
1.5 KiB
C
#include <stdbool.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <time.h>
|
|
#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;
|
|
} |