localtime() is not threadsafe

This commit is contained in:
Glenn Maynard
2004-02-01 01:22:43 +00:00
parent ab1bd7c2eb
commit c20bc728af
+37 -8
View File
@@ -28,12 +28,36 @@ static const CString COINS_DAT = "Data/Coins.dat";
const int COINS_DAT_VERSION = 1; const int COINS_DAT_VERSION = 1;
#if defined(WIN32) // XXX: move to arch_setup.h
#include "RageThreads.h"
struct tm *my_localtime_r( const time_t *timep, struct tm *result )
{
static RageMutex mut;
LockMut(mut);
*result = *localtime( timep );
return result;
}
struct tm *my_gmtime_r( const time_t *timep, struct tm *result )
{
static RageMutex mut;
LockMut(mut);
*result = *gmtime( timep );
return result;
}
#define localtime_r my_localtime_r
#define gmtime_r my_gmtime_r
#endif
tm AddDays( tm start, int iDaysToMove ) tm AddDays( tm start, int iDaysToMove )
{ {
start.tm_mday += iDaysToMove; start.tm_mday += iDaysToMove;
time_t seconds = mktime( &start ); time_t seconds = mktime( &start );
ASSERT( seconds != (time_t)-1 ); ASSERT( seconds != (time_t)-1 );
tm time = *localtime( &seconds ); tm time;
localtime_r( &seconds, &time );
return time; return time;
} }
@@ -141,8 +165,9 @@ void Bookkeeper::UpdateLastSeenTime()
return; return;
} }
tm tOld = *localtime( &lOldTime ); tm tOld, tNew;
tm tNew = *localtime( &lNewTime ); localtime_r( &lOldTime, &tOld );
localtime_r( &lNewTime, &tNew );
CLAMP( tOld.tm_year, tNew.tm_year-1, tNew.tm_year ); CLAMP( tOld.tm_year, tNew.tm_year-1, tNew.tm_year );
@@ -174,9 +199,10 @@ void Bookkeeper::CoinInserted()
UpdateLastSeenTime(); UpdateLastSeenTime();
long lTime = m_iLastSeenTime; long lTime = m_iLastSeenTime;
tm *pTime = localtime( &lTime ); tm pTime;
localtime_r( &lTime, &pTime );
m_iCoinsByHourForYear[pTime->tm_yday][pTime->tm_hour]++; m_iCoinsByHourForYear[pTime.tm_yday][pTime.tm_hour]++;
} }
int Bookkeeper::GetCoinsForDay( int iDayOfYear ) int Bookkeeper::GetCoinsForDay( int iDayOfYear )
@@ -193,7 +219,8 @@ void Bookkeeper::GetCoinsLastDays( int coins[NUM_LAST_DAYS] )
UpdateLastSeenTime(); UpdateLastSeenTime();
long lOldTime = m_iLastSeenTime; long lOldTime = m_iLastSeenTime;
tm time = *localtime( &lOldTime ); tm time;
localtime_r( &lOldTime, &time );
for( int i=0; i<NUM_LAST_DAYS; i++ ) for( int i=0; i<NUM_LAST_DAYS; i++ )
{ {
@@ -208,7 +235,8 @@ void Bookkeeper::GetCoinsLastWeeks( int coins[NUM_LAST_WEEKS] )
UpdateLastSeenTime(); UpdateLastSeenTime();
long lOldTime = m_iLastSeenTime; long lOldTime = m_iLastSeenTime;
tm time = *localtime( &lOldTime ); tm time;
localtime_r( &lOldTime, &time );
time = GetNextSunday( time ); time = GetNextSunday( time );
time = GetYesterday( time ); time = GetYesterday( time );
@@ -233,7 +261,8 @@ void Bookkeeper::GetCoinsByDayOfWeek( int coins[DAYS_IN_WEEK] )
coins[i] = 0; coins[i] = 0;
long lOldTime = m_iLastSeenTime; long lOldTime = m_iLastSeenTime;
tm time = *localtime( &lOldTime ); tm time;
localtime_r( &lOldTime, &time );
for( int d=0; d<DAYS_PER_YEAR; d++ ) for( int d=0; d<DAYS_PER_YEAR; d++ )
{ {