X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fmessages.c;h=03e225b8c467511a7eb85b41d149c28c2c4e66fa;hb=314eeb0078d801ddc34718603cad4fa690392496;hp=93cf6ca4065560f7316decd5f0fa9165e0a605dc;hpb=f119d0e5b18b7286d04fc536a94e0f96e3c51714;p=tpg%2Facess2.git diff --git a/Kernel/messages.c b/Kernel/messages.c index 93cf6ca4..03e225b8 100644 --- a/Kernel/messages.c +++ b/Kernel/messages.c @@ -2,16 +2,21 @@ * AcessOS Microkernel Version * messages.c */ -#include -#include +#include +#include #include +// === IMPORTS === +extern tShortSpinlock glThreadListLock; + // === 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 + * \param Length Length of the message + * \param Data Message data */ int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data) { @@ -32,10 +37,13 @@ int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data) if(!thread) { return -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 ); + return -1; + } // Create message msg = malloc( sizeof(tMsg)+Length ); @@ -53,9 +61,11 @@ int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data) thread->LastMessage = msg; } - RELEASE(&thread->IsLocked); + SHORTREL(&thread->IsLocked); + SHORTLOCK(&glThreadListLock); Threads_Wake( thread ); + SHORTREL(&glThreadListLock); return 0; } @@ -63,11 +73,14 @@ int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data) /** * \fn int Proc_GetMessage(Uint *Err, 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) */ int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer) { int ret; - void *tmp; + void *tmp; tThread *cur = Proc_GetCurThread(); // Check if queue has any items @@ -75,7 +88,7 @@ int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer) return 0; } - LOCK( &cur->IsLocked ); + SHORTLOCK( &cur->IsLocked ); if(Source) *Source = cur->Messages->Source; @@ -83,21 +96,30 @@ int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer) // Get message length if( !Buffer ) { ret = cur->Messages->Length; - RELEASE( &cur->IsLocked ); + SHORTREL( &cur->IsLocked ); return ret; } // Get message if(Buffer != GETMSG_IGNORE) + { + 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; // Remove from list - tmp = cur->Messages->Next; - free(cur->Messages); - cur->Messages = tmp; + tmp = cur->Messages; + cur->Messages = cur->Messages->Next; + + SHORTREL( &cur->IsLocked ); - RELEASE( &cur->IsLocked ); + free(tmp); // Free outside of lock return ret; }