#include "synch.h" #include "system.h" #include "mailbox.h" //Mailbox::Mailbox(){ //} Mailbox::Mailbox(char* debugName = "mail"){ DEBUG('l', "Entering Constructor\n"); m_boxLock = new Lock(debugName); m_waitForReceiver = new Condition(debugName); m_okToWrite = new Condition(debugName); m_okToRead = new Condition(debugName); m_messagePosted = new Condition(debugName); m_messageReceived = new Condition(debugName); m_newMessage = 0; m_AS = 0; m_AR = 0; DEBUG('l', "Exiting constructor\n"); } Mailbox::~Mailbox(){ } void Mailbox::Send(int message){ DEBUG('l', "%s Entering Send\n", currentThread->getName()); m_boxLock->Acquire(); while(m_AS > 0){ DEBUG('l', "%s waiting for okToWrite\n", currentThread->getName()); m_okToWrite->Wait(m_boxLock); } m_AS++; while(m_AR==0){ DEBUG('l', "%s Waiting For Receiver\n", currentThread->getName()); m_waitForReceiver->Wait(m_boxLock); } DEBUG('l', "%s Writing Message\n", currentThread->getName()); m_receiveBuffer = message; m_newMessage = 1; DEBUG('l', "%s Signalling new Message\n", currentThread->getName()); m_messagePosted->Signal(m_boxLock); while(m_newMessage==1){ DEBUG('l', "%s waiting for reception\n", currentThread->getName()); m_messageReceived->Wait(m_boxLock); } m_AS--; DEBUG('l', "%s Signalling ok to write\n", currentThread->getName()); m_okToWrite->Signal(m_boxLock); DEBUG('l', "%s releasing lock\n", currentThread->getName()); m_boxLock->Release(); } void Mailbox::Receive(int* message){ DEBUG('l', "%s Entering Receive\n", currentThread->getName()); DEBUG('l', "%s Aquiring Lock\n", currentThread->getName()); m_boxLock->Acquire(); while(m_AR > 0){ DEBUG('l', "%s waiting for ok to read\n", currentThread->getName()); m_okToRead->Wait(m_boxLock); } m_AR++; DEBUG('l', "%s Signalling that a receiver is present\n", currentThread->getName()); m_waitForReceiver->Signal(m_boxLock); while(m_newMessage==0){ DEBUG('l', "%s waiting for new message\n", currentThread->getName()); m_messagePosted->Wait(m_boxLock); } DEBUG('l', "%s Copying message\n", currentThread->getName()); *message = m_receiveBuffer; m_newMessage = 0; DEBUG('l', "%s Signalling message reception\n", currentThread->getName()); m_messageReceived->Signal(m_boxLock); m_AR--; DEBUG('l', "%s Signalling ok to read\n", currentThread->getName()); m_okToRead->Signal(m_boxLock); DEBUG('l', "%s releasing lock\n", currentThread->getName()); m_boxLock->Release(); }