X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fmessages.c;h=b9d7a6fd189352604197ea73747451454c661d5c;hb=2015e19b71476d1fee2480aef4de60d22ed5438d;hp=afdcdbdeb8c3b353d90d1e809ab504ad12cf4580;hpb=48743e39650eb1ef988380e9d95f27fd40d3a9ce;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/messages.c b/KernelLand/Kernel/messages.c index afdcdbde..b9d7a6fd 100644 --- a/KernelLand/Kernel/messages.c +++ b/KernelLand/Kernel/messages.c @@ -25,7 +25,7 @@ int Proc_SendMessage(Uint Dest, int Length, void *Data) tThread *thread; tMsg *msg; - ENTER("pErr iDest iLength pData", Err, Dest, Length, Data); + ENTER("iDest iLength pData", Dest, Length, Data); if(Length <= 0 || !Data) { errno = -EINVAL; @@ -37,9 +37,8 @@ int Proc_SendMessage(Uint Dest, int Length, void *Data) // Get thread thread = Threads_GetThread( Dest ); - - // Error check if(!thread) LEAVE_RET('i', -1); + LOG("Destination %p(%i %s)", thread, thread->TID, thread->ThreadName); // Get Spinlock SHORTLOCK( &thread->IsLocked ); @@ -79,19 +78,21 @@ int Proc_SendMessage(Uint Dest, int Length, void *Data) * \fn int Proc_GetMessage(Uint *Source, void *Buffer) * \brief Gets a message * \param Source Where to put the source TID + * \param BufSize Size of \a Buffer, only this many bytes will be copied * \param Buffer Buffer to place the message data (set to NULL to just get message length) * \return Message length */ -int Proc_GetMessage(Uint *Source, void *Buffer) +int Proc_GetMessage(Uint *Source, Uint BufSize, void *Buffer) { int ret; void *tmp; tThread *cur = Proc_GetCurThread(); - ENTER("pSource pBuffer", Source, Buffer); + ENTER("pSource xBufSize pBuffer", Source, BufSize, Buffer); // Check if queue has any items if(!cur->Messages) { + LOG("empty queue"); LEAVE('i', 0); return 0; } @@ -114,7 +115,7 @@ int Proc_GetMessage(Uint *Source, void *Buffer) // Get message if(Buffer != GETMSG_IGNORE) { - if( !CheckMem( Buffer, cur->Messages->Length ) ) + if( !CheckMem( Buffer, BufSize ) ) { LOG("Invalid buffer"); errno = -EINVAL; @@ -122,18 +123,28 @@ int Proc_GetMessage(Uint *Source, void *Buffer) LEAVE('i', -1); return -1; } + if( BufSize < cur->Messages->Length ) + Log_Notice("Threads", "Buffer of 0x%x passed, but 0x%x long message, truncated", + BufSize, cur->Messages->Length); + else if( BufSize < cur->Messages->Length ) + BufSize = cur->Messages->Length; + else + ; // equal LOG("Copied to buffer"); - memcpy(Buffer, cur->Messages->Data, cur->Messages->Length); + memcpy(Buffer, cur->Messages->Data, BufSize); } ret = cur->Messages->Length; // Remove from list tmp = cur->Messages; cur->Messages = cur->Messages->Next; + // - Removed last message? Clear the end-of-list pointer if(cur->Messages == NULL) cur->LastMessage = NULL; + // > Otherwise, re-mark the IPCMSG event flag + else cur->EventState |= THREAD_EVENT_IPCMSG; SHORTREL( &cur->IsLocked ); - + free(tmp); // Free outside of lock LEAVE('i', ret);