// === CODE ===
/**
* \fn int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data)
* \brief Send an IPC message
* \param Err Pointer to the errno variable
* \param Dest Destination Thread
// === CODE ===
/**
* \fn int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data)
* \brief Send an IPC message
* \param Err Pointer to the errno variable
* \param Dest Destination Thread
*/
int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data)
{
tThread *thread;
tMsg *msg;
*/
int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data)
{
tThread *thread;
tMsg *msg;
- Log("Proc_SendMessage: (Err=%p, Dest=%i, Length=%i, Data=%p)", Err, Dest, Length, Data);
+ ENTER("pErr iDest iLength pData", Err, Dest, Length, Data);
+ SHORTLOCK(&glThreadListLock);
+ LOG("Waking %p (%i %s)", thread, thread->TID, thread->ThreadName);
+ Threads_Wake( thread );
+ SHORTREL(&glThreadListLock);
- memcpy(Buffer, gCurrentThread->Messages->Data, gCurrentThread->Messages->Length);
- ret = gCurrentThread->Messages->Length;
+ {
+ if( !CheckMem( Buffer, cur->Messages->Length ) )
+ {
+ *Err = -EINVAL;
+ SHORTREL( &cur->IsLocked );
+ return -1;
+ }
+ memcpy(Buffer, cur->Messages->Data, cur->Messages->Length);
+ }
+ ret = cur->Messages->Length;
- tmp = gCurrentThread->Messages->Next;
- free(gCurrentThread->Messages);
- gCurrentThread->Messages = tmp;
+ tmp = cur->Messages;
+ cur->Messages = cur->Messages->Next;
+
+ SHORTREL( &cur->IsLocked );