X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibaxwin4.so_src%2Fipc.cpp;fp=Usermode%2FLibraries%2Flibaxwin4.so_src%2Fipc.cpp;h=a262a9eedc2343404951dafac55efdd979b8f266;hb=10949658e20bd7b35f9ebe1d9354119d993e115b;hp=d6df7f86222216edb0173677dccd777da854c07f;hpb=89fa44978be88e59366ee3e8939a1621f1ebc146;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libaxwin4.so_src/ipc.cpp b/Usermode/Libraries/libaxwin4.so_src/ipc.cpp index d6df7f86..a262a9ee 100644 --- a/Usermode/Libraries/libaxwin4.so_src/ipc.cpp +++ b/Usermode/Libraries/libaxwin4.so_src/ipc.cpp @@ -21,6 +21,7 @@ namespace AxWin { IIPCChannel* gIPCChannel; ::std::mutex glSyncReply; +bool gSyncReplyActive; bool gSyncReplyValid; CDeserialiser gSyncReplyBuf; @@ -82,11 +83,16 @@ void SendMessage(CSerialiser& message) void RecvMessage(CDeserialiser& message) { uint8_t id = message.ReadU8(); + _SysDebug("RecvMessage: id=%i", id); switch(id) { case IPCMSG_REPLY: // Flag reply and take a copy of this message - if( gSyncReplyValid ) + if( !gSyncReplyActive ) + { + _SysDebug("Unexpected reply message %i", message.ReadU8()); + } + else if( gSyncReplyValid ) { // Oh... that was unexpected _SysDebug("Unexpected second reply message %i", message.ReadU8()); @@ -106,6 +112,7 @@ void RecvMessage(CDeserialiser& message) CDeserialiser GetSyncReply(CSerialiser& request, unsigned int Message) { ::std::lock_guard lock(glSyncReply); + gSyncReplyActive = true; gSyncReplyValid = false; // Send once lock is acquired SendMessage(request); @@ -116,14 +123,18 @@ CDeserialiser GetSyncReply(CSerialiser& request, unsigned int Message) if( !AxWin4_WaitEventQueue(0) ) throw ::std::runtime_error("Connection dropped while waiting for reply"); } + gSyncReplyActive = false; uint8_t id = gSyncReplyBuf.ReadU8(); if( id != Message ) { - _SysDebug("Unexpected reply message '%i', message.ReadU8()"); + _SysDebug("Unexpected reply message id=%i, expected %i", + id, Message); + throw ::std::runtime_error("Sequencing error, unexpected reply"); } - return gSyncReplyBuf; + // Use move to avoid copying + return ::std::move(gSyncReplyBuf); } extern "C" void AxWin4_GetScreenDimensions(unsigned int ScreenIndex, unsigned int *Width, unsigned int *Height)