From 10949658e20bd7b35f9ebe1d9354119d993e115b Mon Sep 17 00:00:00 2001 From: John Hodge Date: Mon, 18 Aug 2014 18:35:07 +0800 Subject: [PATCH] Usermode/libaxwin4 - Fix to reply waiting (thread safety), added DrawControl --- .../libaxwin4.so_src/include_exp/axwin4/axwin.h | 3 +++ Usermode/Libraries/libaxwin4.so_src/ipc.cpp | 17 ++++++++++++++--- .../libaxwin4.so_src/window_drawing.cpp | 13 +++++++++++++ Usermode/Libraries/libaxwin4.so_src/wm.cpp | 15 ++++++++++++++- 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/Usermode/Libraries/libaxwin4.so_src/include_exp/axwin4/axwin.h b/Usermode/Libraries/libaxwin4.so_src/include_exp/axwin4/axwin.h index e531db0e..d4a30040 100644 --- a/Usermode/Libraries/libaxwin4.so_src/include_exp/axwin4/axwin.h +++ b/Usermode/Libraries/libaxwin4.so_src/include_exp/axwin4/axwin.h @@ -34,6 +34,9 @@ extern void AxWin4_SetTitle(tAxWin4_Window *Window, const char *Title); extern void AxWin4_MoveWindow(tAxWin4_Window *Window, int X, int Y); extern void AxWin4_ResizeWindow(tAxWin4_Window *Window, unsigned int W, unsigned int H); +extern void AxWin4_DamageRect(tAxWin4_Window *Window, unsigned int X, unsigned int Y, unsigned int W, unsigned int H); +extern void* AxWin4_GetWindowBuffer(tAxWin4_Window *Window); + extern void AxWin4_DrawBitmap(tAxWin4_Window *Window, int X, int Y, unsigned int W, unsigned int H, void *Data); #include "definitions.h" 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) diff --git a/Usermode/Libraries/libaxwin4.so_src/window_drawing.cpp b/Usermode/Libraries/libaxwin4.so_src/window_drawing.cpp index 6947d294..a515d299 100644 --- a/Usermode/Libraries/libaxwin4.so_src/window_drawing.cpp +++ b/Usermode/Libraries/libaxwin4.so_src/window_drawing.cpp @@ -45,5 +45,18 @@ extern "C" void AxWin4_DrawBitmap(tAxWin4_Window *Window, int X, int Y, unsigned } } +extern "C" void AxWin4_DrawControl(tAxWin4_Window *Window, int X, int Y, unsigned int W, unsigned int H, uint16_t ID) +{ + CSerialiser message; + message.WriteU8(IPCMSG_DRAWCTL); + message.WriteU16(Window->m_id); + message.WriteU16(X); + message.WriteU16(Y); + message.WriteU16(W); + message.WriteU16(H); + message.WriteU16(ID); + ::AxWin::SendMessage(message); +} + }; // namespace AxWin diff --git a/Usermode/Libraries/libaxwin4.so_src/wm.cpp b/Usermode/Libraries/libaxwin4.so_src/wm.cpp index fdfa32c2..ee1895ea 100644 --- a/Usermode/Libraries/libaxwin4.so_src/wm.cpp +++ b/Usermode/Libraries/libaxwin4.so_src/wm.cpp @@ -97,6 +97,18 @@ extern "C" void AxWin4_SetTitle(tAxWin4_Window *Window, const char *Title) ::AxWin::SendMessage(message); } +extern "C" void AxWin4_DamageRect(tAxWin4_Window *Window, unsigned int X, unsigned int Y, unsigned int W, unsigned int H) +{ + CSerialiser message; + message.WriteU8(IPCMSG_DAMAGERECT); + message.WriteU16(Window->m_id); + message.WriteU16(X); + message.WriteU16(Y); + message.WriteU16(W); + message.WriteU16(H); + ::AxWin::SendMessage(message); +} + extern "C" void *AxWin4_GetWindowBuffer(tAxWin4_Window *Window) { if( Window->m_fd == -1 ) @@ -106,7 +118,8 @@ extern "C" void *AxWin4_GetWindowBuffer(tAxWin4_Window *Window) req.WriteU16(Window->m_id); CDeserialiser response = GetSyncReply(req, IPCMSG_GETWINBUF); - if( response.ReadU16() != Window->m_id ) { + if( response.ReadU16() != Window->m_id ) + { } -- 2.20.1