+
+// --------------------------------------------------------------------
+// Mutexes
+// --------------------------------------------------------------------
+int Mutex_Acquire(tMutex *Mutex)
+{
+ Threads_Glue_AcquireMutex(&Mutex->Protector.Mutex);
+ return 0;
+}
+
+void Mutex_Release(tMutex *Mutex)
+{
+ Threads_Glue_ReleaseMutex(&Mutex->Protector.Mutex);
+}
+
+// --------------------------------------------------------------------
+// Semaphores
+// --------------------------------------------------------------------
+void Semaphore_Init(tSemaphore *Sem, int InitValue, int MaxValue, const char *Module, const char *Name)
+{
+ memset(Sem, 0, sizeof(tSemaphore));
+ // HACK: Use `Sem->Protector` as space for the semaphore pointer
+ Threads_Glue_SemInit( &Sem->Protector.Mutex, InitValue );
+}
+
+int Semaphore_Wait(tSemaphore *Sem, int MaxToTake)
+{
+ return Threads_Glue_SemWait( Sem->Protector.Mutex, MaxToTake );
+}
+
+int Semaphore_Signal(tSemaphore *Sem, int AmmountToAdd)
+{
+ return Threads_Glue_SemSignal( Sem->Protector.Mutex, AmmountToAdd );
+}
+
+// --------------------------------------------------------------------
+// Event handling
+// --------------------------------------------------------------------
+Uint32 Threads_WaitEvents(Uint32 Mask)
+{
+ Uint32 rv;
+
+ //Log_Debug("Threads", "Mask = %x, ->Events = %x", Mask, gpCurrentThread->Events);
+
+ gpCurrentThread->WaitMask = Mask;
+ if( !(gpCurrentThread->Events & 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));
+ }
+ rv = gpCurrentThread->Events & Mask;
+ gpCurrentThread->Events &= ~Mask;
+ gpCurrentThread->WaitMask = -1;
+
+ //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) 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;
+}
+