X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Facesskernel_src%2Fthreads.c;h=7296a58e25f622b3aef726ed21748341d1d3d457;hb=336ba8b200f6ca1d5d25f09a9d7ddac2e59b26d9;hp=9400d72d4d98f498a7207594ee36ad5eee6f6109;hpb=510431249326d5a44fc502ed5cf798b79a442ce8;p=tpg%2Facess2.git diff --git a/AcessNative/acesskernel_src/threads.c b/AcessNative/acesskernel_src/threads.c index 9400d72d..7296a58e 100644 --- a/AcessNative/acesskernel_src/threads.c +++ b/AcessNative/acesskernel_src/threads.c @@ -10,6 +10,8 @@ #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 @@ -19,7 +21,8 @@ #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 === // === PROTOTYPES === @@ -264,13 +267,34 @@ 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 // -------------------------------------------------------------------- @@ -312,31 +336,31 @@ 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) ) { 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)); + //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); - + 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); @@ -345,6 +369,6 @@ void Threads_PostEvent(tThread *Thread, Uint32 Events) void Threads_ClearEvent(Uint32 EventMask) { - gpCurrentThread->Events &= ~EventMask; + gpCurrentThread->EventState &= ~EventMask; }