Files
itgmania212121/stepmania/src/RageThreads.cpp
T

115 lines
2.1 KiB
C++
Raw Normal View History

/*
* If you're going to use threads, remember this:
*
* Threads suck.
*
* If there's any way to avoid them, take it! Threaded code an order of
* magnitude more complicated, harder to debug and harder to make robust.
*
* That said, here are a few helpers for when they're unavoidable. (Use
* SDL for the rest.)
*/
2003-02-16 04:01:45 +00:00
#include "global.h"
#include "RageThreads.h"
2002-12-21 05:13:45 +00:00
#include "RageTimer.h"
#include "RageLog.h"
#include "RageUtil.h"
RageMutex::RageMutex()
{
Locked = 0;
mut = SDL_CreateMutex();
mutwait = SDL_CreateMutex();
}
RageMutex::~RageMutex()
{
SDL_DestroyMutex(mut);
SDL_DestroyMutex(mutwait);
}
void RageMutex::Lock()
{
while(1)
{
SDL_LockMutex(mut);
if(!Locked || LockedBy == SDL_ThreadID())
{
if(!Locked)
{
/* This mutex is now locked. */
SDL_LockMutex(mutwait);
LockedBy = SDL_ThreadID();
} /* (else it was already locked and we're just increasing the counter) */
Locked++;
SDL_UnlockMutex(mut);
return;
}
SDL_UnlockMutex(mut);
/* Someone else is locking it. Wait until it's available and try again. */
SDL_LockMutex(mutwait);
SDL_UnlockMutex(mutwait);
}
}
void RageMutex::Unlock()
{
SDL_LockMutex(mut);
ASSERT(Locked);
ASSERT(LockedBy == SDL_ThreadID());
Locked--;
if(!Locked)
{
LockedBy = 0;
SDL_UnlockMutex(mutwait);
}
SDL_UnlockMutex(mut);
}
2002-12-21 05:13:45 +00:00
LockMutex::LockMutex(RageMutex &mut, const char *file_, int line_):
mutex(mut),
file(file_),
line(line_),
locked_at(RageTimer::GetTimeSinceStart())
{
mutex.Lock();
2002-12-27 22:11:55 +00:00
locked = true;
2002-12-21 05:13:45 +00:00
}
LockMutex::~LockMutex()
{
2002-12-27 22:11:55 +00:00
if(locked)
mutex.Unlock();
2002-12-21 05:13:45 +00:00
}
2002-12-27 22:11:55 +00:00
void LockMutex::Unlock()
{
ASSERT(locked);
locked = false;
mutex.Unlock();
2002-12-27 23:01:45 +00:00
if(file && locked_at != -1)
{
float dur = RageTimer::GetTimeSinceStart() - locked_at;
if(dur > 0.015)
LOG->Trace(ssprintf("Lock at %s:%i took %f", file, line, dur));
}
2002-12-27 22:11:55 +00:00
}
/*
-----------------------------------------------------------------------------
File: RageThreads
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Glenn Maynard
-----------------------------------------------------------------------------
*/