mirror of
https://github.com/cc65/cc65.git
synced 2025-02-19 06:30:53 +00:00
Split off the compiler-depended wallclock time function in a separate function.
This commit is contained in:
parent
c735a83a98
commit
58b8c14738
@ -52,6 +52,44 @@ Sim65Peripherals Peripherals;
|
|||||||
/* Code */
|
/* Code */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static bool GetWallclockTime (struct timespec * ts)
|
||||||
|
{
|
||||||
|
/* Note: the 'struct timespec' type is supported on all compilers we want to support. */
|
||||||
|
|
||||||
|
#if defined(__MINGW64__)
|
||||||
|
/* This check comes before the check on symbol __MINGW32__, as MinGW64 defines both.
|
||||||
|
*
|
||||||
|
* When using the MinGW64 compiler, neither timespec_get() nor clock_gettime()
|
||||||
|
* are available; this makes the Linux workflow build fail.
|
||||||
|
* The gettimeofday() function works, so use that.
|
||||||
|
*/
|
||||||
|
struct timeval tv;
|
||||||
|
bool time_valid = (gettimeofday(&tv, NULL) == 0);
|
||||||
|
if (time_valid)
|
||||||
|
{
|
||||||
|
ts->tv_sec = tv.tv_sec;
|
||||||
|
ts->tv_nsec = tv.tv_usec * 1000;
|
||||||
|
}
|
||||||
|
#elif defined(__MINGW32__)
|
||||||
|
/* The MinGW32 compiler is not used in the build process.
|
||||||
|
* Support can be added when the need arises.
|
||||||
|
*/
|
||||||
|
#error "The MinGW32 compiler is not supported."
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
/* Using the Microsoft C++ compiler.
|
||||||
|
* clock_gettime() is not available; use timespec_get() instead.
|
||||||
|
*/
|
||||||
|
bool time_valid = timespec_get(ts, TIME_UTC) == TIME_UTC;
|
||||||
|
#else
|
||||||
|
/* Other platforms (Linux, MacOS, ...): assume that clock_gettime()
|
||||||
|
* is available.
|
||||||
|
*/
|
||||||
|
bool time_valid = clock_gettime(CLOCK_REALTIME, ts) == 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return time_valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void PeripheralsWriteByte (uint8_t Addr, uint8_t Val)
|
void PeripheralsWriteByte (uint8_t Addr, uint8_t Val)
|
||||||
@ -67,28 +105,9 @@ void PeripheralsWriteByte (uint8_t Addr, uint8_t Val)
|
|||||||
|
|
||||||
/* Latch the current wallclock time before doing anything else. */
|
/* Latch the current wallclock time before doing anything else. */
|
||||||
|
|
||||||
struct timespec ts; /* Available on all compilers we use. */
|
struct timespec ts; /* The type is available on all compilers we use. */
|
||||||
|
bool time_valid = GetWallclockTime (&ts);
|
||||||
|
|
||||||
#if defined(__MINGW64__)
|
|
||||||
/* Note: we check for MINGW64 before MINGW32, since MINGW64 also defines __MINGW32__. */
|
|
||||||
/* Using timespec_get() in the MinGW64 compiler makes the Linux workflow build fail. */
|
|
||||||
/* Using clock_gettime() in the MinGW64 compiler makes the Linux workflow build fail. */
|
|
||||||
struct timeval tv;
|
|
||||||
bool time_valid = (gettimeofday(&tv, NULL) == 0);
|
|
||||||
if (time_valid)
|
|
||||||
{
|
|
||||||
ts.tv_sec = tv.tv_sec;
|
|
||||||
ts.tv_nsec = tv.tv_usec * 1000;
|
|
||||||
}
|
|
||||||
#elif defined(__MINGW32__)
|
|
||||||
#error "MinGW32 compiler detected, but we're not handling it."
|
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
/* clock_gettime() is not available when using the Microsoft compiler. Use timespec_get() instead. */
|
|
||||||
bool time_valid = timespec_get(&ts, TIME_UTC) == TIME_UTC;
|
|
||||||
#else
|
|
||||||
/* clock_gettime() is available on Linux and MacOS. */
|
|
||||||
bool time_valid = clock_gettime(CLOCK_REALTIME, &ts) == 0;
|
|
||||||
#endif
|
|
||||||
if (time_valid) {
|
if (time_valid) {
|
||||||
/* Wallclock time: number of nanoseconds since 1-1-1970. */
|
/* Wallclock time: number of nanoseconds since 1-1-1970. */
|
||||||
Peripherals.Counter.LatchedWallclockTime = 1000000000 * (uint64_t)ts.tv_sec + ts.tv_nsec;
|
Peripherals.Counter.LatchedWallclockTime = 1000000000 * (uint64_t)ts.tv_sec + ts.tv_nsec;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user