X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Facesskernel_src%2Fthreads.c;h=9400d72d4d98f498a7207594ee36ad5eee6f6109;hb=4e9f0fb47bf1be7303d95a243101880221c82ac1;hp=a7aace8b268e18cf2fa072d0da207378fd3ae2af;hpb=d047958aaade97d65ed5d5ca6c3835c2699e1010;p=tpg%2Facess2.git diff --git a/AcessNative/acesskernel_src/threads.c b/AcessNative/acesskernel_src/threads.c index a7aace8b..9400d72d 100644 --- a/AcessNative/acesskernel_src/threads.c +++ b/AcessNative/acesskernel_src/threads.c @@ -5,29 +5,16 @@ * threads.c * - Thread and process handling */ -#define _SIGNAL_H_ // Stop the acess signal.h being used -#define _HEAP_H_ // Stop heap.h being imported (collides with stdlib heap) -#define _VFS_EXT_H // Stop vfs_ext.h being imported (collides with fd_set) -#define off_t _acess_off_t #include -#undef NULL // Remove acess definition #include #include -#include +#include "../../KernelLand/Kernel/include/semaphore.h" #include #include #include - -#undef CLONE_VM // Such a hack -#undef off_t - -// - Native headers -#include -#include -#include -#include "/usr/include/signal.h" -#include +#include +#include "include/threads_glue.h" #define THREAD_EVENT_WAKEUP 0x80000000 @@ -35,14 +22,6 @@ void VFS_CloneHandleList(int PID); // === STRUCTURES === -#if 0 -typedef struct sState -{ - void *CurState; - Uint SP, BP, IP; -} tState; -#endif - // === PROTOTYPES === int Threads_Wake(tThread *Thread); @@ -119,7 +98,7 @@ tThread *Threads_CloneTCB(tThread *TemplateThread) ret->TID = giThreads_NextThreadID ++; ret->ThreadName = strdup(TemplateThread->ThreadName); - ret->EventSem = SDL_CreateSemaphore(0); + Threads_Glue_SemInit( &ret->EventSem, 0 ); ret->WaitingThreads = NULL; ret->WaitingThreadsEnd = NULL; @@ -220,7 +199,7 @@ tTID Threads_WaitTID(int TID, int *Status) void Threads_Sleep(void) { // TODO: Add to a sleeping queue - pause(); + //pause(); } void Threads_Yield(void) @@ -241,7 +220,7 @@ void Threads_Exit(int TID, int Status) { // Wait for the thread to be waited upon while( gpCurrentThread->WaitingThreads == NULL ) - SDL_Delay(10); + Threads_Glue_Yield(); } #endif @@ -252,7 +231,7 @@ void Threads_Exit(int TID, int Status) Threads_Wake(toWake); while(gpCurrentThread->WaitingThreads == toWake) - SDL_Delay(10); + Threads_Glue_Yield(); } } @@ -297,17 +276,13 @@ int Threads_Fork(void) // -------------------------------------------------------------------- int Mutex_Acquire(tMutex *Mutex) { - if(!Mutex->Protector.IsValid) { - pthread_mutex_init( &Mutex->Protector.Mutex, NULL ); - Mutex->Protector.IsValid = 1; - } - pthread_mutex_lock( &Mutex->Protector.Mutex ); + Threads_Glue_AcquireMutex(&Mutex->Protector.Mutex); return 0; } void Mutex_Release(tMutex *Mutex) { - pthread_mutex_unlock( &Mutex->Protector.Mutex ); + Threads_Glue_ReleaseMutex(&Mutex->Protector.Mutex); } // -------------------------------------------------------------------- @@ -317,50 +292,19 @@ void Semaphore_Init(tSemaphore *Sem, int InitValue, int MaxValue, const char *Mo { memset(Sem, 0, sizeof(tSemaphore)); // HACK: Use `Sem->Protector` as space for the semaphore pointer - *(void**)(&Sem->Protector) = SDL_CreateSemaphore(InitValue); + Threads_Glue_SemInit( &Sem->Protector.Mutex, InitValue ); } int Semaphore_Wait(tSemaphore *Sem, int MaxToTake) { - SDL_SemWait( *(void**)(&Sem->Protector) ); - return 1; + return Threads_Glue_SemWait( Sem->Protector.Mutex, MaxToTake ); } int Semaphore_Signal(tSemaphore *Sem, int AmmountToAdd) { - int i; - for( i = 0; i < AmmountToAdd; i ++ ) - SDL_SemPost( *(void**)(&Sem->Protector) ); - return AmmountToAdd; -} - -// -------------------------------------------------------------------- -// Event handling -// -------------------------------------------------------------------- -int RWLock_AcquireRead(tRWLock *Lock) -{ - if( !Lock->ReaderWaiting ) { - Lock->ReaderWaiting = malloc(sizeof(pthread_rwlock_t)); - pthread_rwlock_init( (void*)Lock->ReaderWaiting, 0 ); - } - pthread_rwlock_rdlock( (void*)Lock->ReaderWaiting ); - return 0; -} -int RWLock_AcquireWrite(tRWLock *Lock) -{ - if( !Lock->ReaderWaiting ) { - Lock->ReaderWaiting = malloc(sizeof(pthread_rwlock_t)); - pthread_rwlock_init( (void*)Lock->ReaderWaiting, 0 ); - } - pthread_rwlock_wrlock( (void*)Lock->ReaderWaiting ); - return 0; -} -void RWLock_Release(tRWLock *Lock) -{ - pthread_rwlock_unlock( (void*)Lock->ReaderWaiting ); + return Threads_Glue_SemSignal( Sem->Protector.Mutex, AmmountToAdd ); } - // -------------------------------------------------------------------- // Event handling // -------------------------------------------------------------------- @@ -373,12 +317,18 @@ Uint32 Threads_WaitEvents(Uint32 Mask) gpCurrentThread->WaitMask = Mask; if( !(gpCurrentThread->Events & Mask) ) { - SDL_SemWait( gpCurrentThread->EventSem ); + if( Threads_Glue_SemWait(gpCurrentThread->EventSem, INT_MAX) == -1 ) { + Log_Warning("Threads", "Wait on eventsem of %p, %p failed", + gpCurrentThread, gpCurrentThread->EventSem); + } + Log_Debug("Threads", "Woken from nap (%i here)", SDL_SemValue(gpCurrentThread->EventSem)); } rv = gpCurrentThread->Events & Mask; gpCurrentThread->Events &= ~Mask; gpCurrentThread->WaitMask = -1; - + + Log_Debug("Threads", "- rv = %x", rv); + return rv; } @@ -387,8 +337,8 @@ void Threads_PostEvent(tThread *Thread, Uint32 Events) Thread->Events |= Events; Log_Debug("Threads", "Trigger event %x (->Events = %p)", Events, Thread->Events); - if( Thread->WaitMask & Events ) { - SDL_SemPost( Thread->EventSem ); + if( Events == 0 || Thread->WaitMask & Events ) { + Threads_Glue_SemSignal( Thread->EventSem, 1 ); // Log_Debug("Threads", "Waking %p(%i %s)", Thread, Thread->TID, Thread->ThreadName); } }