mirror of
https://github.com/mickelson/attract.git
synced 2026-10-12 02:18:55 +00:00
- Add FreeBSD detection and conditional compilation in Makefile - Make GameSWF library changes conditional for FreeBSD compatibility - Use portable shebang in changelog script - All changes are conditional - no impact on Linux/macOS builds
247 lines
4.0 KiB
C++
Executable File
247 lines
4.0 KiB
C++
Executable File
// tu_timer.cpp -- by Thatcher Ulrich <[email protected]>
|
|
|
|
// This source code has been donated to the Public Domain. Do
|
|
// whatever you want with it.
|
|
|
|
// Utility/profiling timer.
|
|
|
|
#ifdef __FreeBSD__
|
|
#include <chrono>
|
|
#else
|
|
#include <sys/timeb.h> // for ftime()
|
|
#endif
|
|
#include <assert.h>
|
|
#include "base/tu_timer.h"
|
|
|
|
#ifdef __FreeBSD__
|
|
// static timeb s_start_time;
|
|
static std::chrono::steady_clock::time_point s_start_time;
|
|
#else
|
|
static timeb s_start_time;
|
|
#endif
|
|
void tu_timer::init_timer()
|
|
{
|
|
#ifdef __FreeBSD__
|
|
s_start_time = std::chrono::steady_clock::now();
|
|
#else
|
|
ftime(&s_start_time);
|
|
#endif
|
|
}
|
|
|
|
Uint32 tu_timer::get_ticks()
|
|
{
|
|
#ifdef __FreeBSD__
|
|
auto now = std::chrono::steady_clock::now();
|
|
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - s_start_time).count();
|
|
return static_cast<int>(elapsed);
|
|
#else
|
|
struct timeb tv;
|
|
ftime(&tv);
|
|
return (tv.time - s_start_time.time) * 1000 + (tv.millitm - s_start_time.millitm);
|
|
#endif
|
|
}
|
|
|
|
tu_datetime::tu_datetime()
|
|
{
|
|
m_time = (time_t) tu_timer::get_systime();
|
|
}
|
|
|
|
// Returns the date for the specified Date object in milliseconds since midnight on January 1, 1970,
|
|
double tu_datetime::get_time() const
|
|
{
|
|
return (double) m_time * 1000; // *1000 means that time in milliseconds
|
|
}
|
|
|
|
// Sets the date for the specified Date object in milliseconds since midnight on January 1, 1970,
|
|
void tu_datetime::set_time(double t)
|
|
{
|
|
m_time = (time_t) (t / 1000);
|
|
}
|
|
|
|
int tu_datetime::get(part part)
|
|
{
|
|
struct tm* gmt = localtime(&m_time);
|
|
if (gmt)
|
|
{
|
|
switch (part)
|
|
{
|
|
case FULLYEAR:
|
|
return gmt->tm_year + 1900;
|
|
break;
|
|
|
|
case YEAR:
|
|
return gmt->tm_year;
|
|
break;
|
|
|
|
case MON:
|
|
return gmt->tm_mon;
|
|
break;
|
|
|
|
case MDAY:
|
|
// Returns the day of the month (an integer from 1 to 31)
|
|
return gmt->tm_mday;
|
|
|
|
case WDAY:
|
|
// Returns the day of the month (an integer from 1 to 31)
|
|
return gmt->tm_wday;
|
|
|
|
case HOUR:
|
|
// Returns the hour (an integer from 0 to 23)
|
|
return gmt->tm_hour;
|
|
break;
|
|
|
|
case MIN:
|
|
return gmt->tm_min;
|
|
break;
|
|
|
|
case SEC:
|
|
return gmt->tm_sec;
|
|
break;
|
|
|
|
default:
|
|
assert(0);
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
void tu_datetime::set(part part, int val)
|
|
{
|
|
struct tm* gmt = localtime(&m_time);
|
|
if (gmt)
|
|
{
|
|
switch (part)
|
|
{
|
|
case FULLYEAR:
|
|
gmt->tm_year = val - 1900; // (current year minus 1900).
|
|
break;
|
|
|
|
case YEAR:
|
|
gmt->tm_year = val;
|
|
break;
|
|
|
|
case MON:
|
|
gmt->tm_mon = val;
|
|
break;
|
|
|
|
case MDAY:
|
|
gmt->tm_mday = val;
|
|
break;
|
|
|
|
case WDAY:
|
|
gmt->tm_wday = val;
|
|
break;
|
|
|
|
case HOUR:
|
|
gmt->tm_hour = val;
|
|
break;
|
|
|
|
case MIN:
|
|
gmt->tm_min = val;
|
|
break;
|
|
|
|
case SEC:
|
|
gmt->tm_sec = val;
|
|
break;
|
|
|
|
default:
|
|
assert(0);
|
|
}
|
|
m_time = mktime(gmt);
|
|
}
|
|
}
|
|
|
|
|
|
Uint64 tu_timer::get_systime()
|
|
{
|
|
time_t ltime;
|
|
time(<ime);
|
|
return (Uint64) ltime;
|
|
}
|
|
|
|
#ifdef _WIN32
|
|
|
|
#include <windows.h>
|
|
|
|
void tu_timer::sleep(int milliseconds)
|
|
{
|
|
::Sleep(milliseconds);
|
|
}
|
|
|
|
|
|
uint64 tu_timer::get_profile_ticks()
|
|
{
|
|
// @@ use rdtsc?
|
|
|
|
LARGE_INTEGER li;
|
|
QueryPerformanceCounter(&li);
|
|
|
|
return li.QuadPart;
|
|
}
|
|
|
|
|
|
double tu_timer::profile_ticks_to_seconds(uint64 ticks)
|
|
{
|
|
LARGE_INTEGER freq;
|
|
QueryPerformanceFrequency(&freq);
|
|
|
|
double seconds = (double) ticks;
|
|
seconds /= (double) freq.QuadPart;
|
|
|
|
return seconds;
|
|
}
|
|
|
|
#else // not _WIN32
|
|
|
|
|
|
#include <sys/time.h>
|
|
#include <unistd.h>
|
|
|
|
|
|
// The profile ticks implementation is just fine for a normal timer.
|
|
|
|
void tu_timer::sleep(int milliseconds)
|
|
{
|
|
usleep(milliseconds * 1000);
|
|
}
|
|
|
|
|
|
uint64 tu_timer::get_profile_ticks()
|
|
{
|
|
// @@ TODO prefer rdtsc when available?
|
|
|
|
// Return microseconds.
|
|
struct timeval tv;
|
|
uint64 result;
|
|
|
|
gettimeofday(&tv, 0);
|
|
|
|
result = tv.tv_sec * 1000000;
|
|
result += tv.tv_usec;
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
double tu_timer::profile_ticks_to_seconds(uint64 ticks)
|
|
{
|
|
// ticks is microseconds. Convert to seconds.
|
|
return ticks / 1000000.0;
|
|
}
|
|
|
|
double tu_timer::profile_ticks_to_milliseconds(uint64 ticks)
|
|
{
|
|
// ticks is microseconds. Convert to milliseconds.
|
|
return ticks / 1000.0;
|
|
}
|
|
|
|
#endif // not _WIN32
|
|
|
|
|
|
// Local Variables:
|
|
// mode: C++
|
|
// c-basic-offset: 8
|
|
// tab-width: 8
|
|
// indent-tabs-mode: t
|
|
// End:
|