2 * AcessOS Microkernel Version
11 * \fn int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data)
12 * \brief Send an IPC message
13 * \param Err Pointer to the errno variable
14 * \param Dest Destination Thread
16 int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data)
21 Log("Proc_SendMessage: (Err=%p, Dest=%i, Length=%i, Data=%p)", Err, Dest, Length, Data);
23 if(Length <= 0 || !Data) {
29 thread = Proc_GetThread( Dest );
32 if(!thread) { return -1; }
35 LOCK( &thread->IsLocked );
37 // Check if thread is still alive
38 if(thread->Status == THREAD_STAT_DEAD) return -1;
41 msg = malloc( sizeof(tMsg)+Length );
43 msg->Source = gCurrentThread->TID;
45 memcpy(msg->Data, Data, Length);
47 // If there are already messages
48 if(thread->LastMessage) {
49 thread->LastMessage->Next = msg;
50 thread->LastMessage = msg;
52 thread->Messages = msg;
53 thread->LastMessage = msg;
56 RELEASE(&thread->IsLocked);
58 Thread_Wake( thread );
64 * \fn int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer)
65 * \brief Gets a message
67 int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer)
72 // Check if queue has any items
73 if(!gCurrentThread->Messages) {
77 LOCK( &gCurrentThread->IsLocked );
80 *Source = gCurrentThread->Messages->Source;
84 ret = gCurrentThread->Messages->Length;
85 RELEASE( &gCurrentThread->IsLocked );
90 if(Buffer != GETMSG_IGNORE)
91 memcpy(Buffer, gCurrentThread->Messages->Data, gCurrentThread->Messages->Length);
92 ret = gCurrentThread->Messages->Length;
95 tmp = gCurrentThread->Messages->Next;
96 free(gCurrentThread->Messages);
97 gCurrentThread->Messages = tmp;
99 RELEASE( &gCurrentThread->IsLocked );