X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Facesskernel_src%2Fthreads.c;h=de61ef47d584d8c43d9d647b6295376641073424;hb=5a66c3a4a2019a7ddea8931c8476bb64f4d29079;hp=c31c5d0548493e3a24d09d4f821630e0b272f550;hpb=9d2ff6cf13e1a0ec5cbdc2773e1a3204e600b2e5;p=tpg%2Facess2.git diff --git a/AcessNative/acesskernel_src/threads.c b/AcessNative/acesskernel_src/threads.c index c31c5d05..de61ef47 100644 --- a/AcessNative/acesskernel_src/threads.c +++ b/AcessNative/acesskernel_src/threads.c @@ -5,44 +5,26 @@ * 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" +typedef signed long long int time_t; +#include "../../Usermode/Libraries/ld-acess.so_src/include_exp/acess/syscall_types.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 // === IMPORTS === -void VFS_CloneHandleList(int PID); +extern void VFS_CloneHandleList(int PID); +extern void VFS_CloneHandlesFromList(int PID, int nFD, int FDs[]); // === STRUCTURES === -#if 0 -typedef struct sState -{ - void *CurState; - Uint SP, BP, IP; -} tState; -#endif - // === PROTOTYPES === int Threads_Wake(tThread *Thread); @@ -119,10 +101,7 @@ tThread *Threads_CloneTCB(tThread *TemplateThread) ret->TID = giThreads_NextThreadID ++; ret->ThreadName = strdup(TemplateThread->ThreadName); - ret->EventSem = SDL_CreateSemaphore(0); - if( !ret->EventSem ) { - Log_Warning("Threads", "Semaphore creation failed - %s", SDL_GetError()); - } + Threads_Glue_SemInit( &ret->EventSem, 0 ); ret->WaitingThreads = NULL; ret->WaitingThreadsEnd = NULL; @@ -223,7 +202,7 @@ tTID Threads_WaitTID(int TID, int *Status) void Threads_Sleep(void) { // TODO: Add to a sleeping queue - pause(); + //pause(); } void Threads_Yield(void) @@ -244,7 +223,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 @@ -255,7 +234,7 @@ void Threads_Exit(int TID, int Status) Threads_Wake(toWake); while(gpCurrentThread->WaitingThreads == toWake) - SDL_Delay(10); + Threads_Glue_Yield(); } } @@ -288,29 +267,46 @@ int Threads_Fork(void) { tThread *thread = Threads_CloneTCB(gpCurrentThread); thread->PID = thread->TID; + // Duplicate the VFS handles (and nodes) from vfs_handle.c - VFS_CloneHandleList(thread->PID); return thread->PID; } +int Threads_Spawn(int nFD, int FDs[], struct s_sys_spawninfo *info) +{ + tThread *thread = Threads_CloneTCB(gpCurrentThread); + thread->PID = thread->TID; + if( info ) + { + // TODO: PGID? + //if( info->flags & SPAWNFLAG_NEWPGID ) + // thread->PGID = thread->PID; + if( info->gid && thread->UID == 0 ) + thread->GID = info->gid; + if( info->uid && thread->UID == 0 ) // last because ->UID is used above + thread->UID = info->uid; + } + + VFS_CloneHandlesFromList(thread->PID, nFD, FDs); + + Log_Debug("Threads", "_spawn: %i", thread->PID); + return thread->PID; +} + // -------------------------------------------------------------------- // Mutexes // -------------------------------------------------------------------- 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); } // -------------------------------------------------------------------- @@ -320,50 +316,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; + return Threads_Glue_SemSignal( Sem->Protector.Mutex, 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 ); -} - - // -------------------------------------------------------------------- // Event handling // -------------------------------------------------------------------- @@ -371,43 +336,51 @@ Uint32 Threads_WaitEvents(Uint32 Mask) { Uint32 rv; - Log_Debug("Threads", "Mask = %x, ->Events = %x", Mask, gpCurrentThread->Events); + //Log_Debug("Threads", "Mask = %x, ->Events = %x", Mask, gpCurrentThread->Events); gpCurrentThread->WaitMask = Mask; - if( !(gpCurrentThread->Events & Mask) ) + if( !(gpCurrentThread->EventState & Mask) ) { - do { - if( SDL_SemWait( gpCurrentThread->EventSem ) == -1 ) { - Log_Warning("Threads", "Wait on eventsem of %p, %p failed", - gpCurrentThread, gpCurrentThread->EventSem); - break; - } - } while(SDL_SemValue(gpCurrentThread->EventSem)); - // NOTE: While loop catches multiple event occurances - Log_Debug("Threads", "Woken from nap (%i here)", SDL_SemValue(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; + rv = gpCurrentThread->EventState & Mask; + gpCurrentThread->EventState &= ~Mask; gpCurrentThread->WaitMask = -1; - Log_Debug("Threads", "- rv = %x", rv); + //Log_Debug("Threads", "- rv = %x", rv); return rv; } 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 ); + Thread->EventState |= Events; +// Log_Debug("Threads", "Trigger event %x (->Events = %p) on %p", Events, Thread->Events, Thread); + + if( Events == 0 || Thread->WaitMask & Events ) { + Threads_Glue_SemSignal( Thread->EventSem, 1 ); // Log_Debug("Threads", "Waking %p(%i %s)", Thread, Thread->TID, Thread->ThreadName); } } void Threads_ClearEvent(Uint32 EventMask) { - gpCurrentThread->Events &= ~EventMask; + gpCurrentThread->EventState &= ~EventMask; +} + +// -------------------------------------------------------------------- +// Signals +// -------------------------------------------------------------------- +void Threads_PostSignal(int SigNum) +{ + Log_Error("Threads", "TODO: %s", __func__); +} +void Threads_SignalGroup(tPGID PGID, int SignalNum) +{ + Log_Error("Threads", "TODO: %s", __func__); }