...and another merge!

This commit is contained in:
Thai Pangsakulyanont
2011-09-09 08:58:41 +07:00
35 changed files with 326 additions and 296 deletions
+1 -1
View File
@@ -2791,8 +2791,8 @@ static const Game g_Game_Lights =
static const Game *g_Games[] =
{
&g_Game_Pump,
&g_Game_Dance,
&g_Game_Pump,
&g_Game_KB7,
&g_Game_Ez2,
&g_Game_Para,
+2
View File
@@ -2261,6 +2261,7 @@ public:
DEFINE_METHOD( IsExtraStage2, IsExtraStage2() )
DEFINE_METHOD( GetCurrentStage, GetCurrentStage() )
DEFINE_METHOD( HasEarnedExtraStage, HasEarnedExtraStage() )
DEFINE_METHOD( GetEarnedExtraStage, GetEarnedExtraStage() )
DEFINE_METHOD( GetEasiestStepsDifficulty, GetEasiestStepsDifficulty() )
DEFINE_METHOD( GetHardestStepsDifficulty, GetHardestStepsDifficulty() )
DEFINE_METHOD( IsEventMode, IsEventMode() )
@@ -2476,6 +2477,7 @@ public:
ADD_METHOD( IsExtraStage2 );
ADD_METHOD( GetCurrentStage );
ADD_METHOD( HasEarnedExtraStage );
ADD_METHOD( GetEarnedExtraStage );
ADD_METHOD( GetEasiestStepsDifficulty );
ADD_METHOD( GetHardestStepsDifficulty );
ADD_METHOD( IsEventMode );
+2 -1
View File
@@ -310,6 +310,7 @@ public:
Character* m_pCurCharacters[NUM_PLAYERS];
bool HasEarnedExtraStage() const { return m_bEarnedExtraStage; }
EarnedExtraStage GetEarnedExtraStage() const { return CalculateEarnedExtraStage(); }
// Ranking Stuff
struct RankingFeat
@@ -390,7 +391,7 @@ private:
EarnedExtraStage CalculateEarnedExtraStage() const;
int m_iAwardedExtraStages[NUM_PLAYERS];
bool m_bEarnedExtraStage;
GameState(const GameState& rhs);
GameState& operator=(const GameState& rhs);
+3
View File
@@ -778,6 +778,7 @@ public:
static int position( T* p, lua_State *L ) { p->SetPosition( FArg(1) ); return 0; }
static int playanimation( T* p, lua_State *L ) { p->PlayAnimation(SArg(1),FArg(2)); return 0; }
static int SetDefaultAnimation( T* p, lua_State *L ) { p->SetDefaultAnimation(SArg(1),FArg(2)); return 0; }
static int GetDefaultAnimation( T* p, lua_State *L ) { lua_pushstring( L, p->GetDefaultAnimation() ); return 1; }
static int loop( T* p, lua_State *L ) { p->SetLoop(BArg(1)); return 0; }
static int rate( T* p, lua_State *L ) { p->SetRate(FArg(1)); return 0; }
static int GetNumStates( T* p, lua_State *L ) { lua_pushnumber( L, p->GetNumStates() ); return 1; }
@@ -788,11 +789,13 @@ public:
ADD_METHOD( position );
ADD_METHOD( playanimation );
ADD_METHOD( SetDefaultAnimation );
ADD_METHOD( GetDefaultAnimation );
ADD_METHOD( loop );
ADD_METHOD( rate );
// sm-ssc adds:
ADD_METHOD( GetNumStates );
//ADD_METHOD( CelShading );
// LoadMilkshapeAsciiBones?
}
};
+1 -1
View File
@@ -83,7 +83,7 @@ private:
float m_fCurAnimationRate;
bool m_bLoop;
bool m_bDrawCelShaded; // for Lua models
Model& operator=(const Model& rhs);
};
+16 -16
View File
@@ -44,16 +44,16 @@ struct TimingTagWriter {
void Write( const int row, const char *value )
{
m_pvsLines->push_back( m_sNext + ssprintf( "%.6f=%s", NoteRowToBeat(row), value ) );
m_pvsLines->push_back( m_sNext + ssprintf( "%.3f=%s", NoteRowToBeat(row), value ) );
m_sNext = ",";
}
void Write( const int row, const float value ) { Write( row, ssprintf( "%.6f", value ) ); }
void Write( const int row, const float value ) { Write( row, ssprintf( "%.3f", value ) ); }
void Write( const int row, const int value ) { Write( row, ssprintf( "%d", value ) ); }
void Write( const int row, const int a, const int b ) { Write( row, ssprintf( "%d=%d", a, b ) ); }
void Write( const int row, const float a, const float b ) { Write( row, ssprintf( "%.6f=%.6f", a, b) ); }
void Write( const int row, const float a, const float b ) { Write( row, ssprintf( "%.3f=%.3f", a, b) ); }
void Write( const int row, const float a, const float b, const unsigned short c )
{ Write( row, ssprintf( "%.6f=%.6f=%hd", a, b, c) ); }
{ Write( row, ssprintf( "%.3f=%.3f=%hd", a, b, c) ); }
void Init( const RString sTag ) { m_sNext = "#" + sTag + ":"; }
void Finish( ) { m_pvsLines->push_back( ( m_sNext != "," ? m_sNext : "" ) + ";" ); }
@@ -235,9 +235,9 @@ static void WriteGlobalTags( RageFile &f, const Song &out )
f.PutLine( "#INSTRUMENTTRACK:" + s + ";\n" );
}
}
f.PutLine( ssprintf( "#OFFSET:%.6f;", out.m_SongTiming.m_fBeat0OffsetInSeconds ) );
f.PutLine( ssprintf( "#SAMPLESTART:%.6f;", out.m_fMusicSampleStartSeconds ) );
f.PutLine( ssprintf( "#SAMPLELENGTH:%.6f;", out.m_fMusicSampleLengthSeconds ) );
f.PutLine( ssprintf( "#OFFSET:%.3f;", out.m_SongTiming.m_fBeat0OffsetInSeconds ) );
f.PutLine( ssprintf( "#SAMPLESTART:%.3f;", out.m_fMusicSampleStartSeconds ) );
f.PutLine( ssprintf( "#SAMPLELENGTH:%.3f;", out.m_fMusicSampleLengthSeconds ) );
f.Write( "#SELECTABLE:" );
switch(out.m_SelectionDisplay)
@@ -256,9 +256,9 @@ static void WriteGlobalTags( RageFile &f, const Song &out )
break;
case DISPLAY_BPM_SPECIFIED:
if( out.m_fSpecifiedBPMMin == out.m_fSpecifiedBPMMax )
f.PutLine( ssprintf( "#DISPLAYBPM:%.6f;", out.m_fSpecifiedBPMMin ) );
f.PutLine( ssprintf( "#DISPLAYBPM:%.3f;", out.m_fSpecifiedBPMMin ) );
else
f.PutLine( ssprintf( "#DISPLAYBPM:%.6f:%.6f;", out.m_fSpecifiedBPMMin, out.m_fSpecifiedBPMMax ) );
f.PutLine( ssprintf( "#DISPLAYBPM:%.3f:%.3f;", out.m_fSpecifiedBPMMin, out.m_fSpecifiedBPMMax ) );
break;
case DISPLAY_BPM_RANDOM:
f.PutLine( ssprintf( "#DISPLAYBPM:*;" ) );
@@ -268,7 +268,7 @@ static void WriteGlobalTags( RageFile &f, const Song &out )
WriteTimingTags( f, out.m_SongTiming, true );
if( out.GetSpecifiedLastSecond() > 0 )
f.PutLine( ssprintf("#LASTSECONDHINT:%.6f;", out.GetSpecifiedLastSecond()) );
f.PutLine( ssprintf("#LASTSECONDHINT:%.3f;", out.GetSpecifiedLastSecond()) );
FOREACH_BackgroundLayer( b )
{
@@ -349,7 +349,7 @@ static RString GetSSCNoteData( const Song &song, const Steps &in, bool bSavingCa
// XXX: Is there a better way to write this?
if (const_cast<TimingData &>(song.m_SongTiming) != in.m_Timing)
{
lines.push_back( ssprintf( "#OFFSET:%.6f;", in.m_Timing.m_fBeat0OffsetInSeconds ) );
lines.push_back( ssprintf( "#OFFSET:%.3f;", in.m_Timing.m_fBeat0OffsetInSeconds ) );
GetTimingTags( lines, in.m_Timing );
}
if (song.GetAttackString() != in.GetAttackString())
@@ -365,9 +365,9 @@ static RString GetSSCNoteData( const Song &song, const Steps &in, bool bSavingCa
float small = in.GetMinBPM();
float big = in.GetMaxBPM();
if (small == big)
lines.push_back( ssprintf( "#DISPLAYBPM:%.6f;", small ) );
lines.push_back( ssprintf( "#DISPLAYBPM:%.3f;", small ) );
else
lines.push_back( ssprintf( "#DISPLAYBPM:%.6f:%.6f;", small, big ) );
lines.push_back( ssprintf( "#DISPLAYBPM:%.3f:%.3f;", small, big ) );
break;
}
case DISPLAY_BPM_RANDOM:
@@ -414,12 +414,12 @@ bool NotesWriterSSC::Write( RString sPath, const Song &out, const vector<Steps*>
if( bSavingCache )
{
f.PutLine( ssprintf( "// cache tags:" ) );
f.PutLine( ssprintf( "#FIRSTSECOND:%.6f;", out.GetFirstSecond() ) );
f.PutLine( ssprintf( "#LASTSECOND:%.6f;", out.GetLastSecond() ) );
f.PutLine( ssprintf( "#FIRSTSECOND:%.3f;", out.GetFirstSecond() ) );
f.PutLine( ssprintf( "#LASTSECOND:%.3f;", out.GetLastSecond() ) );
f.PutLine( ssprintf( "#SONGFILENAME:%s;", out.m_sSongFileName.c_str() ) );
f.PutLine( ssprintf( "#HASMUSIC:%i;", out.m_bHasMusic ) );
f.PutLine( ssprintf( "#HASBANNER:%i;", out.m_bHasBanner ) );
f.PutLine( ssprintf( "#MUSICLENGTH:%.6f;", out.m_fMusicLengthSeconds ) );
f.PutLine( ssprintf( "#MUSICLENGTH:%.3f;", out.m_fMusicLengthSeconds ) );
f.PutLine( ssprintf( "// end cache tags" ) );
}
+15
View File
@@ -501,6 +501,21 @@ void ScreenSelectMusic::Input( const InputEventPlus &input )
return; // ignore
// todo: Allow mousewheel to scroll MusicWheel -aj
/*
if( input.DeviceI.device == DEVICE_MOUSE )
{
if( input.DeviceI.button == MOUSE_WHEELUP )
{
MESSAGEMAN->Broadcast( "PreviousSong" );
m_MusicWheel.Move( -1 );
}
else if( input.DeviceI.button == MOUSE_WHEELDOWN )
{
MESSAGEMAN->Broadcast( "NextSong" );
m_MusicWheel.Move( +1 );
}
}
*/
if( USE_PLAYER_SELECT_MENU )
{
+1 -1
View File
@@ -20,7 +20,7 @@ void FixupPath( RString &path, const RString &sSongPath );
RString GetSongAssetPath( RString sPath, const RString &sSongPath );
/** @brief The version of the .ssc file format. */
const static float STEPFILE_VERSION_NUMBER = 0.78f;
const static float STEPFILE_VERSION_NUMBER = 0.79f;
/** @brief How many edits for this song can each profile have? */
const int MAX_EDITS_PER_SONG_PER_PROFILE = 15;
+21 -10
View File
@@ -59,7 +59,6 @@ static Preference<bool> g_bHideIncompleteCourses( "HideIncompleteCourses", false
RString SONG_GROUP_COLOR_NAME( size_t i ) { return ssprintf( "SongGroupColor%i", (int) i+1 ); }
RString COURSE_GROUP_COLOR_NAME( size_t i ) { return ssprintf( "CourseGroupColor%i", (int) i+1 ); }
SongManager::SongManager()
{
// Register with Lua.
@@ -246,10 +245,10 @@ void SongManager::LoadStepManiaSongDir( RString sDir, LoadingWindow *ld )
SortRStringArray( arrayGroupDirs );
StripCvsAndSvn( arrayGroupDirs );
StripMacResourceForks( arrayGroupDirs );
vector< vector<RString> > arrayGroupSongDirs;
int groupIndex, songCount, songIndex;
groupIndex = 0;
songCount = 0;
FOREACH_CONST( RString, arrayGroupDirs, s ) // foreach dir in /Songs/
@@ -263,19 +262,19 @@ void SongManager::LoadStepManiaSongDir( RString sDir, LoadingWindow *ld )
StripCvsAndSvn( arraySongDirs );
StripMacResourceForks( arraySongDirs );
SortRStringArray( arraySongDirs );
arrayGroupSongDirs.push_back(arraySongDirs);
songCount += arraySongDirs.size();
}
if( songCount==0 ) return;
if( ld ) {
ld->SetIndeterminate( false );
ld->SetTotalWork( songCount );
}
groupIndex = 0;
songIndex = 0;
FOREACH_CONST( RString, arrayGroupDirs, s ) // foreach dir in /Songs/
@@ -573,7 +572,7 @@ RageColor SongManager::GetCourseGroupColor( const RString &sCourseGroup ) const
return SONG_GROUP_COLOR.GetValue( iIndex%NUM_SONG_GROUP_COLORS );
iIndex++;
}
ASSERT_M( 0, ssprintf("requested color for course group '%s' that doesn't exist",sCourseGroup.c_str()) );
return RageColor(1,1,1,1);
}
@@ -585,7 +584,6 @@ RageColor SongManager::GetCourseColor( const Course* pCourse ) const
if( pUE && USE_UNLOCK_COLOR.GetValue() )
return UNLOCK_COLOR.GetValue();
if( USE_PREFERRED_SORT_COLOR )
{
FOREACH_CONST( CoursePointerVector, m_vPreferredCourseSort, v )
@@ -627,7 +625,7 @@ void SongManager::ResetGroupColors()
const vector<Song*> &SongManager::GetSongs( const RString &sGroupName ) const
{
static const vector<Song*> vEmpty;
if( sGroupName == GROUP_ALL )
return m_pSongs;
map<RString, SongPointerVector, Comp>::const_iterator iter = m_mapSongGroupIndex.find( sGroupName );
@@ -780,6 +778,7 @@ void SongManager::InitCoursesFromDisk( LoadingWindow *ld )
vsCourseGroupNames.push_back( SpecialFiles::COURSES_DIR );
SortRStringArray( vsCourseGroupNames );
int courseIndex = 0;
FOREACH_CONST( RString, vsCourseGroupNames, sCourseGroup ) // for each dir in /Courses/
{
// Find all CRS files in this group directory
@@ -787,10 +786,17 @@ void SongManager::InitCoursesFromDisk( LoadingWindow *ld )
GetDirListing( *sCourseGroup + "/*.crs", vsCoursePaths, false, true );
SortRStringArray( vsCoursePaths );
if( ld )
{
ld->SetIndeterminate( false );
ld->SetTotalWork( vsCoursePaths.size() );
}
FOREACH_CONST( RString, vsCoursePaths, sCoursePath )
{
if( ld )
{
ld->SetProgress(courseIndex);
ld->SetText( LOADING_COURSES.GetValue()+ssprintf("\n%s\n%s",
Basename(*sCourseGroup).c_str(),
Basename(*sCoursePath).c_str()));
@@ -806,9 +812,14 @@ void SongManager::InitCoursesFromDisk( LoadingWindow *ld )
}
m_pCourses.push_back( pCourse );
courseIndex++;
}
}
if( ld ) {
ld->SetIndeterminate( true );
}
RefreshCourseGroupInfo();
}
@@ -880,7 +891,7 @@ void SongManager::InitAutogenCourses()
}
aSongs.clear();
if( i < apSongs.size() )
{
sCurArtist = sArtist;
+14 -16
View File
@@ -44,7 +44,6 @@ LowLevelWindow_X11::LowLevelWindow_X11()
int iRevision = iXServerVersion / 1000; iXServerVersion %= 1000;
int iPatch = iXServerVersion;
LOG->Info( "Display: %s (screen %i)", DisplayString(Dpy), iScreen );
LOG->Info( "X server vendor: %s [%i.%i.%i.%i]", XServerVendor( Dpy ), iMajor, iMinor, iRevision, iPatch );
LOG->Info( "Server GLX vendor: %s [%s]", glXQueryServerString( Dpy, iScreen, GLX_VENDOR ), glXQueryServerString( Dpy, iScreen, GLX_VERSION ) );
@@ -86,8 +85,8 @@ LowLevelWindow_X11::~LowLevelWindow_X11()
void *LowLevelWindow_X11::GetProcAddress( RString s )
{
// XXX: We should check whether glXGetProcAddress or
// glXGetProcAddressARB is available, and go by that, instead of
// assuming like this.
// glXGetProcAddressARB is available/not NULL, and go by that,
// instead of assuming like this.
return (void*) glXGetProcAddressARB( (const GLubyte*) s.c_str() );
}
@@ -95,11 +94,9 @@ RString LowLevelWindow_X11::TryVideoMode( const VideoModeParams &p, bool &bNewDe
{
#if defined(UNIX)
/* nVidia cards:
*
* This only works the first time we set up a window; after that, the
* drivers appear to cache the value, so you have to actually restart
* the program to change it again.
*/
* the program to change it again. */
static char buf[128];
strcpy( buf, "__GL_SYNC_TO_VBLANK=" );
strcat( buf, p.vsync?"1":"0" );
@@ -173,7 +170,6 @@ RString LowLevelWindow_X11::TryVideoMode( const VideoModeParams &p, bool &bNewDe
break;
}
XSelectInput( Dpy, Win, winAttrib.your_event_mask );
}
else
{
@@ -243,9 +239,11 @@ RString LowLevelWindow_X11::TryVideoMode( const VideoModeParams &p, bool &bNewDe
XSetWMNormalHints( Dpy, Win, &hints );
}
// Workaround for metacity and compiz, if the window have the same resolution or higher than the screen
// it gets automaximized even when the window is set to don't let do it.
// This happens changing from fullscreen to window mode and our screen resolution is bigger.
/* Workaround for metacity and compiz: if the window have the same
* resolution or higher than the screen, it gets automaximized even
* when the window is set to not let it happen. This happens when
* changing from fullscreen to window mode and our screen resolution
* is bigger. */
{
XEvent xev;
Atom wm_state = XInternAtom(Dpy, "_NET_WM_STATE", False);
@@ -392,8 +390,8 @@ RenderTarget_X11::~RenderTarget_X11()
glDeleteTextures( 1, reinterpret_cast<GLuint*>(&m_iTexHandle) );
}
/* Note that although the texture size may need to be a power of 2, the Pbuffer
* does not. */
/* Note that although the texture size may need to be a power of 2,
* the Pbuffer does not. */
void RenderTarget_X11::Create( const RenderTargetParam &param, int &iTextureWidthOut, int &iTextureHeightOut )
{
//ASSERT( param.iWidth == power_of_two(param.iWidth) && param.iHeight == power_of_two(param.iHeight) );
@@ -410,7 +408,7 @@ void RenderTarget_X11::Create( const RenderTargetParam &param, int &iTextureWidt
GLX_GREEN_SIZE, 8,
GLX_BLUE_SIZE, 8,
GLX_ALPHA_SIZE, param.bWithAlpha? 8:GLX_DONT_CARE,
GLX_DOUBLEBUFFER, False,
GLX_DEPTH_SIZE, param.bWithDepthBuffer? 16:GLX_DONT_CARE,
None
@@ -515,9 +513,9 @@ RenderTarget *LowLevelWindow_X11::CreateRenderTarget()
void LowLevelWindow_X11::BeginConcurrentRenderingMainThread()
{
/* Move the main thread, which is going to be loading textures, etc. but
* not rendering, to an undisplayed window. This results in smoother
* rendering. */
/* Move the main thread, which is going to be loading textures, etc.
* but not rendering, to an undisplayed window. This results in
* smoother rendering. */
bool b = glXMakeCurrent( Dpy, g_AltWindow, g_pContext );
ASSERT(b);
}
+15 -13
View File
@@ -12,9 +12,10 @@ public:
virtual void Halt( bool Kill ) = 0;
virtual void Resume() = 0;
/* Get the identifier for this thread. The actual meaning of this is implementation-
* defined, except that each thread has exactly one ID and each ID corresponds to
* one thread. (This means that Win32 thread handles are not acceptable as ThreadIds.) */
/* Get the identifier for this thread. The actual meaning of this is
* implementation-defined, except that each thread has exactly one ID
* and each ID corresponds to one thread. (This means that Win32
* thread handles are not acceptable as ThreadIds.) */
virtual uint64_t GetThreadId() const = 0;
virtual int Wait() = 0;
@@ -28,19 +29,20 @@ public:
MutexImpl( RageMutex *pParent ): m_Parent(pParent) {}
virtual ~MutexImpl() { }
/* Lock the mutex. If mutex timeouts are implemented, and the mutex times out,
* return false and do not lock the mutex. No other failure return is allowed;
* all other errors should fail with an assertion. */
/* Lock the mutex. If mutex timeouts are implemented, and the mutex
* times out, return false and do not lock the mutex. No other failure
* return is allowed; all other errors should fail with an assertion. */
virtual bool Lock() = 0;
/* Non-blocking lock. If locking the mutex would block because the mutex is already
* locked by another thread, return false; otherwise return true and lock the mutex. */
/* Non-blocking lock. If locking the mutex would block because the mutex
* is already locked by another thread, return false; otherwise
* return true and lock the mutex. */
virtual bool TryLock() = 0;
/* Unlock the mutex. This must only be called when the mutex is locked; implementations
* may fail with an assertion if the mutex is not locked. */
/* Unlock the mutex. This must only be called when the mutex is locked;
* implementations may fail with an assertion if the mutex is not locked. */
virtual void Unlock() = 0;
private:
MutexImpl(const MutexImpl& rhs);
MutexImpl& operator=(const MutexImpl& rhs);
@@ -74,8 +76,8 @@ EventImpl *MakeEvent( MutexImpl *pMutex );
SemaImpl *MakeSemaphore( int iInitialValue );
uint64_t GetThisThreadId();
/* Since ThreadId is implementation-defined, we can't define a universal invalid
* value. Return the invalid value for this implementation. */
/* Since ThreadId is implementation-defined, we can't define a universal
* invalid value. Return the invalid value for this implementation. */
uint64_t GetInvalidThreadId();
#endif
+29 -32
View File
@@ -17,19 +17,17 @@
void ThreadImpl_Pthreads::Halt( bool Kill )
{
/* Linux:
* Send a SIGSTOP to the thread. If we send a SIGKILL, pthreads will
* Send a SIGSTOP to the thread. If we send a SIGKILL, pthreads will
* "helpfully" propagate it to the other threads, and we'll get killed, too.
*
* This isn't ideal, since it can cause the process to background as far as
* the shell is concerned, so the shell prompt can display before the crash
* handler actually displays a message.
*/
* handler actually displays a message. */
SuspendThread( threadHandle );
}
void ThreadImpl_Pthreads::Resume()
{
/* Linux: Send a SIGCONT to the thread. */
// Linux: Send a SIGCONT to the thread.
ResumeThread( threadHandle );
}
@@ -65,12 +63,12 @@ static void *StartThread( void *pData )
pThis->threadHandle = GetCurrentThreadId();
*pThis->m_piThreadID = pThis->threadHandle;
/* Tell MakeThread that we've set m_piThreadID, so it's safe to return. */
// Tell MakeThread that we've set m_piThreadID, so it's safe to return.
pThis->m_StartFinishedSem->Post();
int iRet = pThis->m_pFunc( pThis->m_pData );
return new int(iRet);
}
@@ -86,10 +84,10 @@ ThreadImpl *MakeThread( int (*pFunc)(void *pData), void *pData, uint64_t *piThre
int ret = pthread_create( &thread->thread, NULL, StartThread, thread );
ASSERT_M( ret == 0, ssprintf( "MakeThread: pthread_create: %s", strerror(errno)) );
/* Don't return until StartThread sets m_piThreadID. */
// Don't return until StartThread sets m_piThreadID.
thread->m_StartFinishedSem->Wait();
delete thread->m_StartFinishedSem;
return thread;
}
@@ -105,12 +103,11 @@ MutexImpl_Pthreads::~MutexImpl_Pthreads()
ASSERT_M( ret == 0, ssprintf("Error deleting mutex: %s", strerror(errno)) );
}
#if defined(HAVE_PTHREAD_MUTEX_TIMEDLOCK) || defined(HAVE_PTHREAD_COND_TIMEDWAIT)
static bool UseTimedlock()
{
#if defined(LINUX)
/* Valgrind crashes and burns on pthread_mutex_timedlock. */
// Valgrind crashes and burns on pthread_mutex_timedlock.
if( RunningUnderValgrind() )
return false;
#endif
@@ -124,12 +121,12 @@ bool MutexImpl_Pthreads::Lock()
#if defined(HAVE_PTHREAD_MUTEX_TIMEDLOCK)
if( UseTimedlock() )
{
int len = 10; /* seconds */
int len = 10; // seconds
int tries = 2;
while( tries-- )
{
/* Wait for ten seconds. If it takes longer than that, we're
/* Wait for ten seconds. If it takes longer than that, we're
* probably deadlocked. */
timeval tv;
gettimeofday( &tv, NULL );
@@ -149,9 +146,9 @@ bool MutexImpl_Pthreads::Lock()
continue;
case ETIMEDOUT:
/* Timed out. Probably deadlocked. Try again one more time, with a smaller
* timeout, just in case we're debugging and happened to stop while waiting
* on the mutex. */
/* Timed out. Probably deadlocked. Try again one more time,
* with a smaller timeout, just in case we're debugging
* and happened to stop while waiting on the mutex. */
len = 1;
break;
@@ -205,8 +202,8 @@ MutexImpl *MakeMutex( RageMutex *pParent )
return new MutexImpl_Pthreads( pParent );
}
/* Check if condattr_setclock is supported, and supports the clock that RageTimer
* selected. */
/* Check if condattr_setclock is supported, and supports the clock that
* RageTimer selected. */
#if defined(UNIX)
#include <dlfcn.h>
#include "arch/ArchHooks/ArchHooks_Unix.h"
@@ -247,7 +244,7 @@ namespace
break;
}
/* Make sure that we can set up the clock attribute. */
// Make sure that we can set up the clock attribute.
pthread_condattr_t condattr;
pthread_condattr_init( &condattr );
@@ -314,21 +311,21 @@ bool EventImpl_Pthreads::Wait( RageTimer *pTimeout )
return true;
}
/* If the clock is not CLOCK_MONOTONIC, or we can't change the wait clock (no
* condattr_setclock), pthread_cond_timedwait has an inherent race condition:
* the system clock may change before we call it. */
/* If the clock is not CLOCK_MONOTONIC, or we can't change the wait clock
* (no condattr_setclock), pthread_cond_timedwait has an inherent race
* condition: the system clock may change before we call it. */
timespec abstime;
if( g_CondattrSetclock != NULL || GetClock() == CLOCK_REALTIME )
{
/* If we support condattr_setclock, we'll set the condition to use the same
* clock as RageTimer and can use it directly. If the clock is CLOCK_REALTIME,
* that's the default anyway. */
/* If we support condattr_setclock, we'll set the condition to use
* the same clock as RageTimer and can use it directly. If the
* clock is CLOCK_REALTIME, that's the default anyway. */
abstime.tv_sec = pTimeout->m_secs;
abstime.tv_nsec = pTimeout->m_us * 1000;
}
else
{
/* The RageTimer clock is different than the wait clock; convert it. */
// The RageTimer clock is different than the wait clock; convert it.
timeval tv;
gettimeofday( &tv, NULL );
@@ -427,7 +424,7 @@ bool SemaImpl_Pthreads::TryWait()
return true;
}
#else
/* Use conditions, to work around OS X "forgetting" to implement semaphores. */
// Use conditions, to work around OS X "forgetting" to implement semaphores.
SemaImpl_Pthreads::SemaImpl_Pthreads( int iInitialValue )
{
int ret = pthread_cond_init( &m_Cond, NULL );
@@ -480,9 +477,9 @@ bool SemaImpl_Pthreads::Wait()
break;
case ETIMEDOUT:
/* Timed out. Probably deadlocked. Try again one more time, with a smaller
* timeout, just in case we're debugging and happened to stop while waiting
* on the mutex. */
/* Timed out. Probably deadlocked. Try again one more time,
* with a smaller timeout, just in case we're debugging and
* happened to stop while waiting on the mutex. */
++ts.tv_sec;
tries--;
break;
@@ -525,7 +522,7 @@ bool SemaImpl_Pthreads::TryWait()
pthread_mutex_unlock( &m_Mutex);
return false;
}
--m_iValue;
pthread_mutex_unlock( &m_Mutex);
+4 -5
View File
@@ -12,13 +12,12 @@ public:
pthread_t thread;
/* Linux:
* Keep a list of child PIDs, so we can send them SIGKILL. This has an
* added bonus: if this is corrupted, we'll just send signals and they'll
* fail; we won't blow up (unless we're root).
*/
* Keep a list of child PIDs, so we can send them SIGKILL. This has
* an added bonus: if this is corrupted, we'll just send signals and
* they'll fail; we won't blow up (unless we're root). */
uint64_t threadHandle;
/* These are only used during initialization. */
// These are only used during initialization.
int (*m_pFunc)( void *pData );
void *m_pData;
uint64_t *m_piThreadID;
+21 -19
View File
@@ -219,9 +219,9 @@ bool MutexImpl_Win32::Lock()
if( SimpleWaitForSingleObject( mutex, len ) )
return true;
/* Timed out; probably deadlocked. Try a couple more times, with a smaller
* timeout, just in case we're debugging and happened to stop while waiting
* on the mutex. */
/* Timed out; probably deadlocked. Try a couple more times, with
* a smaller timeout, just in case we're debugging and happened
* to stop while waiting on the mutex. */
len = 1000;
}
@@ -238,8 +238,8 @@ void MutexImpl_Win32::Unlock()
{
const bool ret = !!ReleaseMutex( mutex );
/* We can't ASSERT here, since this is called from checkpoints, which is
* called from ASSERT. */
/* We can't ASSERT here, since this is called from checkpoints,
* which is called from ASSERT. */
if( !ret )
sm_crash( werr_ssprintf( GetLastError(), "ReleaseMutex failed" ) );
}
@@ -278,10 +278,11 @@ EventImpl_Win32::~EventImpl_Win32()
CloseHandle( m_WaitersDone );
}
/* SignalObjectAndWait is atomic, which leads to more fair event handling. However,
* we don't guarantee or depend upon fair events, and SignalObjectAndWait is only
* available in NT. I also can't find a single function to signal an object like
* SignalObjectAndWait, so we need to know if the object is a mutex or an event. */
/* SignalObjectAndWait is atomic, which leads to more fair event handling.
* However, we don't guarantee or depend upon fair events, and
* SignalObjectAndWait is only available in NT. I also can't find a single
* function to signal an object like SignalObjectAndWait, so we need to
* know if the object is a mutex or an event. */
static bool PortableSignalObjectAndWait( HANDLE hObjectToSignal, HANDLE hObjectToWaitOn, bool bFirstParamIsMutex, unsigned iMilliseconds = INFINITE )
{
static bool bSignalObjectAndWaitUnavailable = false;
@@ -364,8 +365,9 @@ bool EventImpl_Win32::Wait( RageTimer *pTimeout )
EnterCriticalSection( &m_iNumWaitingLock );
if( !bSuccess )
{
/* Avoid a race condition: someone may have signalled the object between PortableSignalObjectAndWait
* and EnterCriticalSection. While we hold m_iNumWaitingLock, poll (with a zero timeout) the
/* Avoid a race condition: someone may have signalled the object
* between PortableSignalObjectAndWait and EnterCriticalSection.
* While we hold m_iNumWaitingLock, poll (with a zero timeout) the
* object one last time. */
if( WaitForSingleObject( m_WakeupSema, 0 ) == WAIT_OBJECT_0 )
bSuccess = true;
@@ -374,8 +376,8 @@ bool EventImpl_Win32::Wait( RageTimer *pTimeout )
bool bLastWaiting = m_iNumWaiting == 0;
LeaveCriticalSection( &m_iNumWaitingLock );
/* If we're the last waiter to wake up, and we were actually woken by another
* thread (not by timeout), wake up the signaller. */
/* If we're the last waiter to wake up, and we were actually woken by
* another thread (not by timeout), wake up the signaller. */
if( bLastWaiting && bSuccess )
PortableSignalObjectAndWait( m_WaitersDone, m_pParent->mutex, false );
else
@@ -416,8 +418,8 @@ void EventImpl_Win32::Broadcast()
LeaveCriticalSection( &m_iNumWaitingLock );
/* The last waiter will touch m_WaitersDone, so we wait for all waiters to
* wake up and start waiting for the mutex before returning. */
/* The last waiter will touch m_WaitersDone, so we wait for all waiters
* to wake up and start waiting for the mutex before returning. */
WaitForSingleObject( m_WaitersDone, INFINITE );
}
@@ -452,7 +454,7 @@ bool SemaImpl_Win32::Wait()
while( tries-- )
{
/* Wait for 15 seconds. If it takes longer than that, we're
/* Wait for 15 seconds. If it takes longer than that, we're
* probably deadlocked. */
if( SimpleWaitForSingleObject( sem, len ) )
{
@@ -460,9 +462,9 @@ bool SemaImpl_Win32::Wait()
return true;
}
/* Timed out; probably deadlocked. Try again a few more times, with a smaller
* timeout, just in case we're debugging and happened to stop while waiting
* on the mutex. */
/* Timed out; probably deadlocked. Try again a few more times,
* with a smaller timeout, just in case we're debugging and
* happened to stop while waiting on the mutex. */
len = 1000;
}
+3 -4
View File
@@ -43,16 +43,15 @@ BEGIN
CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,0,34,332,1
END
IDD_LOADING_DIALOG DIALOGEX 0, 0, 317, 94
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
IDD_LOADING_DIALOG DIALOGEX 0, 0, 320, 94
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE
EXSTYLE WS_EX_APPWINDOW
CAPTION "Stepmania"
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
CTEXT "line1",IDC_STATIC_MESSAGE1,7,43,303,10,SS_NOPREFIX | SS_CENTERIMAGE
CTEXT "line2",IDC_STATIC_MESSAGE2,7,52,303,10,SS_NOPREFIX | SS_CENTERIMAGE
CTEXT "line3",IDC_STATIC_MESSAGE3,7,61,303,10,SS_NOPREFIX | SS_CENTERIMAGE
CONTROL "",IDC_SPLASH,"Static",SS_BITMAP,0,0,310,25
CONTROL "",IDC_SPLASH,"Static",SS_BITMAP,0,0,316,25
CONTROL "",IDC_PROGRESS,"msctls_progress32",0x0,7,73,303,14
END