#include #include #include #include #include "common.h" #include "ipc.h" #include "io.h" #include "pa2345.h" #include "child.h" #include "banking.h" #include "lamport_time.h" #define BALANCE_HIST_SIZE(hist) \ (sizeof(BalanceHistory) - (sizeof(hist->s_history) - hist->s_history_len)) /** Syncronization cycle. */ static void sync_state(proc_t *p, MessageType type, char *payload, size_t payload_len) { Message msg; increase_lamport_time(); msg.s_header = (MessageHeader) { .s_magic = MESSAGE_MAGIC, .s_payload_len = payload_len, .s_type = type, .s_local_time = get_lamport_time() }; memcpy(msg.s_payload, payload, payload_len); send_multicast((void*)p, (const Message *)&msg); for (size_t i = 1; i <= p->procnum; i++) { if (i != p->self_id) { while(receive((void*)p, i, &msg) != 0){}; set_lamport_time(msg.s_header.s_local_time); if (msg.s_header.s_type != type) { fprintf(stderr, "ID %d waited for %d, but got %d.\n", p->self_id, type, msg.s_header.s_type); } } } } static void send_balance(proc_t *p, char *payload, size_t payload_len) { Message msg; increase_lamport_time(); msg.s_header = (MessageHeader) { .s_magic = MESSAGE_MAGIC, .s_payload_len = payload_len, .s_type = BALANCE_HISTORY, .s_local_time = get_lamport_time() }; memcpy(msg.s_payload, payload, payload_len); send((void*)p, PARENT_ID, &msg); } /* Copy balance if there was no transfer on the