Merge branch 'master' of git://git.ucc.asn.au/tpg/acess2
[tpg/acess2.git] / Kernel / messages.c
index 1391d99..afdcdbd 100644 (file)
 #include <threads.h>
 #include <threads_int.h>
 #include <errno.h>
+#include <events.h>
 
 // === CODE ===
 /**
- * \fn int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data)
+ * \fn int Proc_SendMessage(Uint Dest, int Length, void *Data)
  * \brief Send an IPC message
- * \param Err  Pointer to the errno variable
  * \param Dest Destination Thread
  * \param Length       Length of the message
  * \param Data Message data
  */
-int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data)
+int Proc_SendMessage(Uint Dest, int Length, void *Data)
 {
        tThread *thread;
        tMsg    *msg;
@@ -28,10 +28,13 @@ int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data)
        ENTER("pErr iDest iLength pData", Err, Dest, Length, Data);
        
        if(Length <= 0 || !Data) {
-               *Err = -EINVAL;
+               errno = -EINVAL;
                LEAVE_RET('i', -1);
        }
        
+       // TODO: Check message length against global/per-thread maximums
+       // TODO: Restrict queue length
+
        // Get thread
        thread = Threads_GetThread( Dest );
        
@@ -64,21 +67,22 @@ int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data)
        }
        
        SHORTREL(&thread->IsLocked);
-       
+
+       // Wake the thread      
        LOG("Waking %p (%i %s)", thread, thread->TID, thread->ThreadName);
-       Threads_Wake( thread );
+       Threads_PostEvent( thread, THREAD_EVENT_IPCMSG );
        
        LEAVE_RET('i', 0);
 }
 
 /**
- * \fn int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer)
+ * \fn int Proc_GetMessage(Uint *Source, void *Buffer)
  * \brief Gets a message
- * \param Err  Pointer to \a errno
  * \param Source       Where to put the source TID
  * \param Buffer       Buffer to place the message data (set to NULL to just get message length)
+ * \return Message length
  */
-int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer)
+int Proc_GetMessage(Uint *Source, void *Buffer)
 {
         int    ret;
        void    *tmp;
@@ -113,7 +117,7 @@ int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer)
                if( !CheckMem( Buffer, cur->Messages->Length ) )
                {
                        LOG("Invalid buffer");
-                       *Err = -EINVAL;
+                       errno = -EINVAL;
                        SHORTREL( &cur->IsLocked );
                        LEAVE('i', -1);
                        return -1;

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