Fixed Video_DrawText passing too many arguments to _SysDebug
[tpg/acess2.git] / Kernel / messages.c
index 32e579b..03e225b 100644 (file)
@@ -6,6 +6,9 @@
 #include <threads.h>
 #include <errno.h>
 
+// === IMPORTS ===
+extern tShortSpinlock  glThreadListLock;
+
 // === CODE ===
 /**
  * \fn int Proc_SendMessage(Uint *Err, Uint Dest, int Length, void *Data)
@@ -34,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 );
@@ -55,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;
 }
@@ -72,7 +80,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 +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;
@@ -88,7 +96,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 +106,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 +114,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;
 }

UCC git Repository :: git.ucc.asn.au