NativeLib - Including kernelland locks
[tpg/acess2.git] / Tools / nativelib / threads.c
index 7393c12..b214f21 100644 (file)
@@ -17,6 +17,7 @@ tThread       *Threads_int_CreateTCB(tThread *Parent);
 tThread        *gThreads_List;
 tThread __thread       *lpThreads_This;
  int   giThreads_NextTID = 1;
+tShortSpinlock glThreadListLock;
 
 // === CODE ===
 void Threads_int_Init(void)
@@ -35,11 +36,11 @@ void Threads_PostEvent(tThread *Thread, Uint32 Events)
                // nope.avi
                return ;
        }
-       Threads_int_MutexLock(Thread->Protector);
+       SHORTLOCK( &Thread->IsLocked );
        Thread->PendingEvents |= Events;
        if( Thread->WaitingEvents & Events )
                Threads_int_SemSignal(Thread->WaitSemaphore);
-       Threads_int_MutexRelease(Thread->Protector);
+       SHORTREL( &Thread->IsLocked );
 }
 
 Uint32 Threads_WaitEvents(Uint32 Events)
@@ -61,9 +62,9 @@ void Threads_ClearEvent(Uint32 Mask)
                Log_Notice("Threads", "_ClearEvent: Threading disabled");
                return ;
        }
-       Threads_int_MutexLock(lpThreads_This->Protector);
+       SHORTLOCK(&lpThreads_This->IsLocked);
        lpThreads_This->PendingEvents &= ~Mask;
-       Threads_int_MutexRelease(lpThreads_This->Protector);
+       SHORTREL(&lpThreads_This->IsLocked);
 }
 
 tUID Threads_GetUID(void) { return 0; }
@@ -87,14 +88,20 @@ void Threads_Sleep(void)
        Log_Warning("Threads", "Threads_Sleep shouldn't be used");
 }
 
+void Threads_int_WaitForStatusEnd(enum eThreadStatus Status)
+{
+       while( lpThreads_This->Status != Status )
+               Threads_int_SemWaitAll(lpThreads_This->WaitSemaphore);
+}
+
 int Threads_SetName(const char *Name)
 {
        if( !lpThreads_This )
                return 0;
 
-       if( lpThreads_This->Name )
-               free(lpThreads_This->Name);
-       lpThreads_This->Name = strdup(Name);
+       if( lpThreads_This->ThreadName )
+               free(lpThreads_This->ThreadName);
+       lpThreads_This->ThreadName = strdup(Name);
 
        return 0;
 }
@@ -107,6 +114,18 @@ int *Threads_GetErrno(void)
        return &a_errno;
 }
 
+tThread *Threads_RemActive(void)
+{
+       return lpThreads_This;
+}
+
+void Threads_AddActive(tThread *Thread)
+{
+       Thread->Status = THREAD_STAT_ACTIVE;
+       // Increment state-change semaphore
+       Threads_int_SemSignal(Thread->WaitSemaphore);
+}
+
 struct sProcess *Threads_int_CreateProcess(void)
 {
        struct sProcess *ret = calloc(sizeof(struct sProcess), 1);
@@ -121,7 +140,7 @@ tThread *Threads_int_CreateTCB(tThread *Parent)
        tThread *ret = calloc( sizeof(tThread), 1 );
        ret->TID = giThreads_NextTID ++;
        ret->WaitSemaphore = Threads_int_SemCreate();
-       ret->Protector = Threads_int_MutexCreate();
+       //ret->Protector = Threads_int_MutexCreate();
 
        if( !Parent )
        {

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