X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fmessages.c;h=1391d9914c3e8fb6158b725c4ed8d8a87b2cce1d;hb=4e46ccc3dac894e24b88afc834a3bd712665b2e5;hp=057f99791ab808fa59ca9627c7c8d59ae06d2e23;hpb=95a7eaaa4a1065334125b65130866f8d1048ddb7;p=tpg%2Facess2.git diff --git a/Kernel/messages.c b/Kernel/messages.c index 057f9979..1391d991 100644 --- a/Kernel/messages.c +++ b/Kernel/messages.c @@ -1,9 +1,14 @@ /* - * AcessOS Microkernel Version + * Acess2 Kernel + * - By John Hodge (thePowersGang) + * * messages.c + * - IPC Messages */ -#include -#include +#define DEBUG 0 +#include +#include +#include #include // === CODE === @@ -20,24 +25,27 @@ 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); if(Length <= 0 || !Data) { *Err = -EINVAL; - return -1; + LEAVE_RET('i', -1); } // Get thread thread = Threads_GetThread( Dest ); // Error check - if(!thread) { return -1; } + if(!thread) LEAVE_RET('i', -1); // Get Spinlock - LOCK( &thread->IsLocked ); + SHORTLOCK( &thread->IsLocked ); // Check if thread is still alive - if(thread->Status == THREAD_STAT_DEAD) return -1; + if(thread->Status == THREAD_STAT_DEAD) { + SHORTREL( &thread->IsLocked ); + LEAVE_RET('i', -1); + } // Create message msg = malloc( sizeof(tMsg)+Length ); @@ -55,11 +63,12 @@ int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data) thread->LastMessage = msg; } - RELEASE(&thread->IsLocked); + SHORTREL(&thread->IsLocked); + LOG("Waking %p (%i %s)", thread, thread->TID, thread->ThreadName); Threads_Wake( thread ); - return 0; + LEAVE_RET('i', 0); } /** @@ -72,37 +81,57 @@ int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data) int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer) { int ret; - void *tmp; + void *tmp; tThread *cur = Proc_GetCurThread(); + + ENTER("pSource pBuffer", Source, Buffer); // Check if queue has any items if(!cur->Messages) { + LEAVE('i', 0); return 0; } - LOCK( &cur->IsLocked ); + SHORTLOCK( &cur->IsLocked ); - if(Source) + if(Source) { *Source = cur->Messages->Source; + LOG("*Source = %i", *Source); + } // Get message length if( !Buffer ) { ret = cur->Messages->Length; - RELEASE( &cur->IsLocked ); + SHORTREL( &cur->IsLocked ); + LEAVE('i', ret); return ret; } // Get message if(Buffer != GETMSG_IGNORE) + { + if( !CheckMem( Buffer, cur->Messages->Length ) ) + { + LOG("Invalid buffer"); + *Err = -EINVAL; + SHORTREL( &cur->IsLocked ); + LEAVE('i', -1); + return -1; + } + LOG("Copied to buffer"); memcpy(Buffer, cur->Messages->Data, cur->Messages->Length); + } ret = cur->Messages->Length; // Remove from list - tmp = cur->Messages->Next; - free(cur->Messages); - cur->Messages = tmp; + tmp = cur->Messages; + cur->Messages = cur->Messages->Next; + if(cur->Messages == NULL) cur->LastMessage = NULL; - RELEASE( &cur->IsLocked ); + SHORTREL( &cur->IsLocked ); + free(tmp); // Free outside of lock + + LEAVE('i', ret); return ret; }