X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Tools%2Fnativelib%2Finclude%2Fthreads_int.h;h=7bd91c17ec92431c3d9e4e666096b1176df9eca8;hb=eb42cce3c834d711e888d7866db98c563710993d;hp=36e5aba3ca863d2bd37aa2feaa141ea5863d2711;hpb=3241c317ee9f714eba6a0fa82de79cfe5f104993;p=tpg%2Facess2.git diff --git a/Tools/nativelib/include/threads_int.h b/Tools/nativelib/include/threads_int.h index 36e5aba3..7bd91c17 100644 --- a/Tools/nativelib/include/threads_int.h +++ b/Tools/nativelib/include/threads_int.h @@ -8,6 +8,12 @@ #ifndef _THREADS_INT_H_ #define _THREADS_INT_H_ +#include + +#ifndef _THREADS_H_ +typedef struct sThread tThread; +#endif + #define THREAD_EVENT_RWLOCK (1 << 8) typedef struct sThreadIntMutex tThreadIntMutex; // actually pthreads @@ -39,24 +45,71 @@ struct sThread void *ThreadHandle; int TID; - tThreadIntMutex *Protector; + int Status; - uint32_t PendingEvents; + tShortSpinlock IsLocked; + + uint32_t EventState; uint32_t WaitingEvents; tThreadIntSem *WaitSemaphore; // pthreads - char *Name; + char *ThreadName; + + int bInstrTrace; // Used for semaphore tracing + + int RetStatus; + void *WaitPointer; // Init Only void (*SpawnFcn)(void*); void *SpawnData; }; +enum eThreadStatus { + THREAD_STAT_NULL, // Invalid process + THREAD_STAT_ACTIVE, // Running and schedulable process + THREAD_STAT_SLEEPING, // Message Sleep + THREAD_STAT_MUTEXSLEEP, // Mutex Sleep + THREAD_STAT_RWLOCKSLEEP, // Read-Writer lock Sleep + THREAD_STAT_SEMAPHORESLEEP, // Semaphore Sleep + THREAD_STAT_QUEUESLEEP, // Queue + THREAD_STAT_EVENTSLEEP, // Event sleep + THREAD_STAT_WAITING, // ??? (Waiting for a thread) + THREAD_STAT_PREINIT, // Being created + THREAD_STAT_ZOMBIE, // Died/Killed, but parent not informed + THREAD_STAT_DEAD, // Awaiting burial (free) + THREAD_STAT_BURIED // If it's still on the list here, something's wrong +}; +static const char * const casTHREAD_STAT[] = { + "THREAD_STAT_NULL", + "THREAD_STAT_ACTIVE", + "THREAD_STAT_SLEEPING", + "THREAD_STAT_MUTEXSLEEP", + "THREAD_STAT_RWLOCKSLEEP", + "THREAD_STAT_SEMAPHORESLEEP", + "THREAD_STAT_QUEUESLEEP", + "THREAD_STAT_EVENTSLEEP", + "THREAD_STAT_WAITING", + "THREAD_STAT_PREINIT", + "THREAD_STAT_ZOMBIE", + "THREAD_STAT_DEAD", + "THREAD_STAT_BURIED" +}; + extern struct sThread __thread *lpThreads_This; +extern tShortSpinlock glThreadListLock; extern int Threads_int_CreateThread(struct sThread *Thread); extern int Threads_int_ThreadingEnabled(void); + +extern tThread *Proc_GetCurThread(void); +extern tThread *Threads_RemActive(void); +extern void Threads_AddActive(tThread *Thread); +extern void Threads_int_WaitForStatusEnd(enum eThreadStatus Status); +extern int Threads_int_Sleep(enum eThreadStatus Status, void *Ptr, int Num, tThread **ListHead, tThread **ListTail, tShortSpinlock *Lock); +extern void Semaphore_ForceWake(tThread *Thread); + extern tThreadIntMutex *Threads_int_MutexCreate(void); extern void Threads_int_MutexDestroy(tThreadIntMutex *Mutex); extern void Threads_int_MutexLock(tThreadIntMutex *Mutex);