X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fmessages.c;h=ce23d6b14f043a90483d229a379e9a2b5be6f5d9;hb=6f4c456fc47a9f470417cdf647473e21fdd848e7;hp=aaedf5c00149ddd0895eee61791ca66c34d2f0df;hpb=1c2a87ec67d332b6a165c79398693eac1eb1166e;p=tpg%2Facess2.git diff --git a/Kernel/messages.c b/Kernel/messages.c index aaedf5c0..ce23d6b1 100644 --- a/Kernel/messages.c +++ b/Kernel/messages.c @@ -2,10 +2,15 @@ * AcessOS Microkernel Version * messages.c */ +#define DEBUG 1 #include -#include +#include +#include #include +// === IMPORTS === +extern tShortSpinlock glThreadListLock; + // === CODE === /** * \fn int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data) @@ -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,13 @@ 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; + LEAVE_RET('i', 0); } /** @@ -72,7 +82,7 @@ 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(); // Check if queue has any items @@ -80,7 +90,7 @@ int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer) return 0; } - LOCK( &cur->IsLocked ); + SHORTLOCK( &cur->IsLocked ); if(Source) *Source = cur->Messages->Source; @@ -88,7 +98,7 @@ 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; } @@ -98,7 +108,7 @@ int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer) if( !CheckMem( Buffer, cur->Messages->Length ) ) { *Err = -EINVAL; - RELEASE( &cur->IsLocked ); + SHORTREL( &cur->IsLocked ); return -1; } memcpy(Buffer, cur->Messages->Data, cur->Messages->Length); @@ -106,11 +116,12 @@ int Proc_GetMessage(Uint *Err, Uint *Source, void *Buffer) ret = cur->Messages->Length; // Remove from list - tmp = cur->Messages->Next; - free( (void*)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; }