X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Tools%2Fnativelib%2Fthreads.c;h=9a4bfdfb68ed4b97e6afa4c8f338ac4c3bc90d47;hb=d1e3e105c7605d0c9f02dd7e2f3b1377ea61aea4;hp=1231c439a45f7c4cac1b37428f4b6ea834c41e01;hpb=7ba570fe3cc5418f42decf5b72ac2295cce9e60f;p=tpg%2Facess2.git diff --git a/Tools/nativelib/threads.c b/Tools/nativelib/threads.c index 1231c439..9a4bfdfb 100644 --- a/Tools/nativelib/threads.c +++ b/Tools/nativelib/threads.c @@ -16,11 +16,16 @@ tThread *Threads_int_CreateTCB(tThread *Parent); // === GLOBALS === tThread *gThreads_List; tThread __thread *lpThreads_This; + int giThreads_NextTID = 1; +tShortSpinlock glThreadListLock; // === CODE === void Threads_int_Init(void) { - lpThreads_This = Threads_int_CreateTCB(NULL); + if( !lpThreads_This ) { + lpThreads_This = Threads_int_CreateTCB(NULL); + Threads_SetName("ThreadZero"); + } } tThread *Proc_GetCurThread(void) @@ -34,16 +39,16 @@ 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) { - if( Threads_int_ThreadingEnabled() ) { + if( !Threads_int_ThreadingEnabled() ) { Log_Notice("Threads", "_WaitEvents: Threading disabled"); return 0; } @@ -56,19 +61,19 @@ Uint32 Threads_WaitEvents(Uint32 Events) void Threads_ClearEvent(Uint32 Mask) { - if( Threads_int_ThreadingEnabled() ) { + if( !Threads_int_ThreadingEnabled() ) { 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; } tGID Threads_GetGID(void) { return 0; } -tTID Threads_GetTID(void) { return 0; } +tTID Threads_GetTID(void) { return lpThreads_This ? lpThreads_This->TID : 0; } int *Threads_GetMaxFD(void) { return &lpThreads_This->Process->MaxFDs; } char **Threads_GetCWD(void) { return &lpThreads_This->Process->CWD; } @@ -86,14 +91,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; } @@ -106,6 +117,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); @@ -118,8 +141,9 @@ struct sProcess *Threads_int_CreateProcess(void) 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 ) {