X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin3_src%2FWM%2Fipc.c;h=9cf68e8a87ed7b195325807e96bf6e3a7d95eb37;hb=845b6f9d90bb87b5e760e4d49aa93b0e003ab750;hp=79e0956fc6a4e1a341b107f9f7d735643483afea;hpb=608ec5aa6e1bd522777faa63323beaeaef928928;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin3_src/WM/ipc.c b/Usermode/Applications/axwin3_src/WM/ipc.c index 79e0956f..9cf68e8a 100644 --- a/Usermode/Applications/axwin3_src/WM/ipc.c +++ b/Usermode/Applications/axwin3_src/WM/ipc.c @@ -6,8 +6,6 @@ * - Interprocess communication */ #include -#include -#include #include #include #include @@ -15,220 +13,23 @@ #include #include // Hotkey registration #include // Renderer IPC messages +#include -#define AXWIN_PORT 4101 - -#define STATICBUF_SIZE 64 #define MAX_WINDOWS_PER_APP 128 -// === TYPES === -typedef struct sIPC_Type tIPC_Type; - -struct sIPC_Type -{ - int (*GetIdentSize)(const void *Ident); - int (*CompareIdent)(const void *Ident1, const void *Ident2); - void (*SendMessage)(const void *Ident, size_t Length, const void *Data); -}; - -struct sIPC_Client -{ - const tIPC_Type *IPCType; - const void *Ident; // Stored after structure - - int nWindows; - tWindow **Windows; -}; - // === IMPORTS === extern tWindow *gpWM_FocusedWindow; // Needed for _FocusWindow // === PROTOTYPES === -void IPC_Init(void); -void IPC_FillSelect(int *nfds, fd_set *set); -void IPC_HandleSelect(fd_set *set); - int IPC_Type_Datagram_GetSize(const void *Ident); - int IPC_Type_Datagram_Compare(const void *Ident1, const void *Ident2); -void IPC_Type_Datagram_Send(const void *Ident, size_t Length, const void *Data); - int IPC_Type_Sys_GetSize(const void *Ident); - int IPC_Type_Sys_Compare(const void *Ident1, const void *Ident2); -void IPC_Type_Sys_Send(const void *Ident, size_t Length, const void *Data); - int IPC_Type_IPCPipe_GetSize(const void *Ident); - int IPC_Type_IPCPipe_Compare(const void *Ident1, const void *Ident2); -void IPC_Type_IPCPipe_Send(const void *Ident, size_t Length, const void *Data); tIPC_Client *IPC_int_GetClient(const tIPC_Type *IPCType, const void *Ident); void IPC_int_DropClient(tIPC_Client *Client); void IPC_Handle(tIPC_Client *Client, size_t MsgLen, tAxWin_IPCMessage *Msg); // === GLOBALS === -const tIPC_Type gIPC_Type_Datagram = { - IPC_Type_Datagram_GetSize, - IPC_Type_Datagram_Compare, - IPC_Type_Datagram_Send -}; -const tIPC_Type gIPC_Type_SysMessage = { - IPC_Type_Sys_GetSize, - IPC_Type_Sys_Compare, - IPC_Type_Sys_Send -}; -const tIPC_Type gIPC_Type_IPCPipe = { - IPC_Type_IPCPipe_GetSize, - IPC_Type_IPCPipe_Compare, - IPC_Type_IPCPipe_Send -}; - int giNetworkFileHandle = -1; - int giIPCPipeHandle = -1; int giIPC_ClientCount; tIPC_Client **gIPC_Clients; // === CODE === -void IPC_Init(void) -{ - int tmp; - // TODO: Check this - giNetworkFileHandle = _SysOpen("/Devices/ip/loop/udp", OPENFLAG_READ); - if( giNetworkFileHandle != -1 ) - { - tmp = AXWIN_PORT; - _SysIOCtl(giNetworkFileHandle, 4, &tmp); // TODO: Don't hard-code IOCtl number - } - - giIPCPipeHandle = _SysOpen("/Devices/ipcpipe/axwin"/*-$USER*/, OPENFLAG_CREATE); - _SysDebug("giIPCPipeHandle = %i", giIPCPipeHandle); - if( giIPCPipeHandle == -1 ) - _SysDebug("ERROR: Can't create IPCPipe handle"); -} - -void _setfd(int fd, int *nfds, fd_set *set) -{ - if( fd >= 0 ) - { - if( fd >= *nfds ) *nfds = fd+1; - FD_SET(fd, set); - } -} - -void IPC_FillSelect(int *nfds, fd_set *set) -{ - _setfd(giNetworkFileHandle, nfds, set); - _setfd(giIPCPipeHandle, nfds, set); - for( int i = 0; i < giIPC_ClientCount; i ++ ) - { - if( gIPC_Clients[i] && gIPC_Clients[i]->IPCType == &gIPC_Type_IPCPipe ) - _setfd( *(int*)(gIPC_Clients[i]->Ident), nfds, set ); - } -} - -void IPC_HandleSelect(fd_set *set) -{ - if( giNetworkFileHandle != -1 && FD_ISSET(giNetworkFileHandle, set) ) - { - char staticBuf[STATICBUF_SIZE]; - int readlen, identlen; - char *msg; - - readlen = _SysRead(giNetworkFileHandle, staticBuf, sizeof(staticBuf)); - - identlen = 4 + Net_GetAddressSize( ((uint16_t*)staticBuf)[1] ); - msg = staticBuf + identlen; - - IPC_Handle( IPC_int_GetClient(&gIPC_Type_Datagram, staticBuf), readlen - identlen, (void*)msg); - //_SysDebug("IPC_HandleSelect: UDP handled"); - } - - if( giIPCPipeHandle != -1 && FD_ISSET(giIPCPipeHandle, set) ) - { - int newfd = _SysOpenChild(giIPCPipeHandle, "newclient", OPENFLAG_READ|OPENFLAG_WRITE); - _SysDebug("newfd = %i", newfd); - IPC_int_GetClient(&gIPC_Type_IPCPipe, &newfd); - } - - for( int i = 0; i < giIPC_ClientCount; i ++ ) - { - if( gIPC_Clients[i] && gIPC_Clients[i]->IPCType == &gIPC_Type_IPCPipe ) - { - int fd = *(const int*)gIPC_Clients[i]->Ident; - if( FD_ISSET(fd, set) ) - { - char staticBuf[STATICBUF_SIZE]; - size_t len; - len = _SysRead(fd, staticBuf, sizeof(staticBuf)); - if( len == (size_t)-1 ) { - // TODO: Check errno for EINTR - IPC_int_DropClient(gIPC_Clients[i]); - break; - } - IPC_Handle( gIPC_Clients[i], len, (void*)staticBuf ); - } - } - } - - size_t len; - int tid; - while( (len = _SysGetMessage(&tid, 0, NULL)) ) - { - char data[len]; - _SysGetMessage(NULL, len, data); - - IPC_Handle( IPC_int_GetClient(&gIPC_Type_SysMessage, &tid), len, (void*)data ); -// _SysDebug("IPC_HandleSelect: Message handled"); - } -} - -int IPC_Type_Datagram_GetSize(const void *Ident) -{ - return 4 + Net_GetAddressSize( ((const uint16_t*)Ident)[1] ); -} - -int IPC_Type_Datagram_Compare(const void *Ident1, const void *Ident2) -{ - // Pass the buck :) - // - No need to worry about mis-matching sizes, as the size is computed - // from the 3rd/4th bytes, hence it will differ before the size is hit. - return memcmp(Ident1, Ident2, IPC_Type_Datagram_GetSize(Ident1)); -} - -void IPC_Type_Datagram_Send(const void *Ident, size_t Length, const void *Data) -{ - int identlen = IPC_Type_Datagram_GetSize(Ident); - char tmpbuf[ identlen + Length ]; - memcpy(tmpbuf, Ident, identlen); // Header - memcpy(tmpbuf + identlen, Data, Length); // Data - // TODO: Handle fragmented packets - _SysWrite(giNetworkFileHandle, tmpbuf, sizeof(tmpbuf)); -} - -int IPC_Type_Sys_GetSize(const void *Ident) -{ - return sizeof(pid_t); -} - -int IPC_Type_Sys_Compare(const void *Ident1, const void *Ident2) -{ - return *(const tid_t*)Ident1 - *(const tid_t*)Ident2; -} - -void IPC_Type_Sys_Send(const void *Ident, size_t Length, const void *Data) -{ - _SysSendMessage( *(const tid_t*)Ident, Length, Data ); -} - -int IPC_Type_IPCPipe_GetSize(const void *Ident) -{ - return sizeof(int); -} -int IPC_Type_IPCPipe_Compare(const void *Ident1, const void *Ident2) -{ - return *(const int*)Ident1 - *(const int*)Ident2; -} -void IPC_Type_IPCPipe_Send(const void *Ident, size_t Length, const void *Data) -{ - size_t rv = _SysWrite( *(const int*)Ident, Data, Length ); - if(rv != Length) { - _SysDebug("Sent message oversize %x", Length); - } -} - // --- Client -> Window Mappings int _CompareClientPtrs(const void *_a, const void *_b) { @@ -236,7 +37,7 @@ int _CompareClientPtrs(const void *_a, const void *_b) tIPC_Client *b = *(tIPC_Client**)_b; ASSERT(a); - ASSERT(b); + if(!b) return -1; if(a->IPCType < b->IPCType) return -1; if(a->IPCType > b->IPCType) return 1; @@ -255,6 +56,7 @@ int IPC_int_BSearchClients(const tIPC_Client *TargetClient, int *Pos) while(div > 0) { div /= 2; + _SysDebug("Cmp with %i [%i] (%p)", pos, div, gIPC_Clients[pos]); cmp = _CompareClientPtrs(&TargetClient, &gIPC_Clients[pos]); // _SysDebug("Checking against %i gives %i", pos, cmp); if(cmp == 0) break; @@ -669,10 +471,16 @@ void IPC_Handle(tIPC_Client *Client, size_t MsgLen, tAxWin_IPCMessage *Msg) // _SysDebug("IPC_Handle: (IPCType=%p, Ident=%p, MsgLen=%i, Msg=%p)", // IPCType, Ident, MsgLen, Msg); - if( MsgLen < sizeof(tAxWin_IPCMessage) ) + if( MsgLen < sizeof(*Msg) ) { + _SysDebug("IPC_Handle: %p Dropped full undersize message (%i < %i)", + Client, MsgLen, sizeof(*Msg)); return ; - if( MsgLen < sizeof(tAxWin_IPCMessage) + Msg->Size ) + } + if( MsgLen < sizeof(*Msg) + Msg->Size ) { + _SysDebug("IPC_Handle: %p Dropped undersize message (%i < %i+%i)", + Client, MsgLen, sizeof(*Msg), Msg->Size); return ; + } if( Msg->Flags & IPCMSG_FLAG_RENDERER ) { @@ -690,7 +498,7 @@ void IPC_Handle(tIPC_Client *Client, size_t MsgLen, tAxWin_IPCMessage *Msg) _SysDebug("WARNING: Message %i has no handler in %s", Msg->ID, renderer->Name); return ; } - _SysDebug("IPC_Handle: Call %s-%i", renderer->Name, Msg->ID); + _SysDebug("IPC_Handle: Call %s-%i %ib", renderer->Name, Msg->ID, Msg->Size); rv = renderer->IPCHandlers[Msg->ID](win, Msg->Size, Msg->Data); if( rv ) _SysDebug("IPC_Handle: rv != 0 (%i)", rv); @@ -709,7 +517,7 @@ void IPC_Handle(tIPC_Client *Client, size_t MsgLen, tAxWin_IPCMessage *Msg) return ; } - _SysDebug("IPC_Handle: Call WM-%i", Msg->ID); + _SysDebug("IPC_Handle: Call WM-%i %ib", Msg->ID, Msg->Size); rv = gIPC_MessageHandlers[Msg->ID](Client, Msg); if( rv ) _SysDebug("IPC_Handle: rv != 0 (%i)", rv);