#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;
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 );
}
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;
if( !CheckMem( Buffer, cur->Messages->Length ) )
{
LOG("Invalid buffer");
- *Err = -EINVAL;
+ errno = -EINVAL;
SHORTREL( &cur->IsLocked );
LEAVE('i', -1);
return -1;