Usermode/libaxwin4 - Fix to reply waiting (thread safety), added DrawControl
authorJohn Hodge <[email protected]>
Mon, 18 Aug 2014 10:35:07 +0000 (18:35 +0800)
committerJohn Hodge <[email protected]>
Mon, 18 Aug 2014 10:35:07 +0000 (18:35 +0800)
Usermode/Libraries/libaxwin4.so_src/include_exp/axwin4/axwin.h
Usermode/Libraries/libaxwin4.so_src/ipc.cpp
Usermode/Libraries/libaxwin4.so_src/window_drawing.cpp
Usermode/Libraries/libaxwin4.so_src/wm.cpp

index e531db0..d4a3004 100644 (file)
@@ -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"
index d6df7f8..a262a9e 100644 (file)
@@ -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<std::mutex>   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)
index 6947d29..a515d29 100644 (file)
@@ -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
 
index fdfa32c..ee1895e 100644 (file)
@@ -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 )
+               {
                        
                }
                

UCC git Repository :: git.ucc.asn.au