Tools/NetTest - Add TCP retransmit test
[tpg/acess2.git] / KernelLand / Kernel / messages.c
index afdcdbd..b9d7a6f 100644 (file)
@@ -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);

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