git.ucc.asn.au
/
tpg
/
acess2.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
89fa449
)
Usermode/libaxwin4 - Fix to reply waiting (thread safety), added DrawControl
author
John Hodge
<
[email protected]
>
Mon, 18 Aug 2014 10:35:07 +0000
(18:35 +0800)
committer
John Hodge
<
[email protected]
>
Mon, 18 Aug 2014 10:35:07 +0000
(18:35 +0800)
Usermode/Libraries/libaxwin4.so_src/include_exp/axwin4/axwin.h
patch
|
blob
|
history
Usermode/Libraries/libaxwin4.so_src/ipc.cpp
patch
|
blob
|
history
Usermode/Libraries/libaxwin4.so_src/window_drawing.cpp
patch
|
blob
|
history
Usermode/Libraries/libaxwin4.so_src/wm.cpp
patch
|
blob
|
history
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
e531db0
..
d4a3004
100644
(file)
--- 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_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"
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
d6df7f8
..
a262a9e
100644
(file)
--- 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;
IIPCChannel* gIPCChannel;
::std::mutex glSyncReply;
+bool gSyncReplyActive;
bool gSyncReplyValid;
CDeserialiser gSyncReplyBuf;
bool gSyncReplyValid;
CDeserialiser gSyncReplyBuf;
@@
-82,11
+83,16
@@
void SendMessage(CSerialiser& message)
void RecvMessage(CDeserialiser& message)
{
uint8_t id = message.ReadU8();
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
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());
{
// 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);
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);
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");
}
if( !AxWin4_WaitEventQueue(0) )
throw ::std::runtime_error("Connection dropped while waiting for reply");
}
+ gSyncReplyActive = false;
uint8_t id = gSyncReplyBuf.ReadU8();
if( id != Message )
{
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)
}
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
6947d29
..
a515d29
100644
(file)
--- 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
}; // namespace AxWin
diff --git
a/Usermode/Libraries/libaxwin4.so_src/wm.cpp
b/Usermode/Libraries/libaxwin4.so_src/wm.cpp
index
fdfa32c
..
ee1895e
100644
(file)
--- 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);
}
::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 )
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);
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