X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fmessages.c;h=afdcdbdeb8c3b353d90d1e809ab504ad12cf4580;hb=6bcb63ea0505129d32b249772b554b0848bb5612;hp=03e225b8c467511a7eb85b41d149c28c2c4e66fa;hpb=aaf21fdf21db89849c419315e3d9ff956ed60d5d;p=tpg%2Facess2.git diff --git a/Kernel/messages.c b/Kernel/messages.c index 03e225b8..afdcdbde 100644 --- a/Kernel/messages.c +++ b/Kernel/messages.c @@ -1,40 +1,45 @@ /* - * AcessOS Microkernel Version + * Acess2 Kernel + * - By John Hodge (thePowersGang) + * * messages.c + * - IPC Messages */ +#define DEBUG 0 #include #include +#include #include - -// === IMPORTS === -extern tShortSpinlock glThreadListLock; +#include // === 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; - 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; + 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 ); // Error check - if(!thread) { return -1; } + if(!thread) LEAVE_RET('i', -1); // Get Spinlock SHORTLOCK( &thread->IsLocked ); @@ -42,7 +47,7 @@ int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data) // Check if thread is still alive if(thread->Status == THREAD_STAT_DEAD) { SHORTREL( &thread->IsLocked ); - return -1; + LEAVE_RET('i', -1); } // Create message @@ -62,41 +67,47 @@ int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data) } SHORTREL(&thread->IsLocked); + + // Wake the thread + LOG("Waking %p (%i %s)", thread, thread->TID, thread->ThreadName); + Threads_PostEvent( thread, THREAD_EVENT_IPCMSG ); - SHORTLOCK(&glThreadListLock); - Threads_Wake( thread ); - SHORTREL(&glThreadListLock); - - return 0; + 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; tThread *cur = Proc_GetCurThread(); + + ENTER("pSource pBuffer", Source, Buffer); // Check if queue has any items if(!cur->Messages) { + LEAVE('i', 0); return 0; } SHORTLOCK( &cur->IsLocked ); - if(Source) + if(Source) { *Source = cur->Messages->Source; + LOG("*Source = %i", *Source); + } // Get message length if( !Buffer ) { ret = cur->Messages->Length; SHORTREL( &cur->IsLocked ); + LEAVE('i', ret); return ret; } @@ -105,10 +116,13 @@ int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer) { if( !CheckMem( Buffer, cur->Messages->Length ) ) { - *Err = -EINVAL; + LOG("Invalid buffer"); + errno = -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; @@ -116,10 +130,12 @@ int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer) // Remove from list tmp = cur->Messages; cur->Messages = cur->Messages->Next; + if(cur->Messages == NULL) cur->LastMessage = NULL; SHORTREL( &cur->IsLocked ); free(tmp); // Free outside of lock - + + LEAVE('i', ret); return ret; }