2016-01-28 14:52:40 +01:00
|
|
|
/** @file
|
|
|
|
|
*
|
|
|
|
|
* @par History
|
|
|
|
|
*/
|
2016-02-11 22:54:43 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "polclock.h"
|
|
|
|
|
|
2018-01-29 21:55:48 +01:00
|
|
|
#include <atomic>
|
2018-10-22 20:29:55 +02:00
|
|
|
#include <thread>
|
2018-01-29 21:55:48 +01:00
|
|
|
|
2018-10-22 20:29:55 +02:00
|
|
|
#include "../clib/logfacility.h"
|
|
|
|
|
#include "../clib/spinlock.h"
|
2016-02-11 22:54:43 +01:00
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
namespace Pol
|
|
|
|
|
{
|
|
|
|
|
namespace Core
|
|
|
|
|
{
|
2018-10-22 20:29:55 +02:00
|
|
|
static PolClock::time_point polclock_base = PolClock::time_point( PolClock::duration( 0 ) );
|
|
|
|
|
static PolClock::time_point poltime_base = PolClock::time_point( PolClock::duration( 0 ) );
|
|
|
|
|
static PolClock::time_point poltime_paused_at = PolClock::time_point( PolClock::duration( 0 ) );
|
|
|
|
|
static PolClock::time_point polclock_paused_at = PolClock::time_point( PolClock::duration( 0 ) );
|
|
|
|
|
static Clib::SpinLock polclock_lock;
|
2016-02-11 22:54:43 +01:00
|
|
|
|
2016-02-19 19:26:35 +01:00
|
|
|
void pol_sleep_ms( unsigned int millis )
|
|
|
|
|
{
|
2018-10-22 20:29:55 +02:00
|
|
|
std::this_thread::sleep_for( std::chrono::milliseconds( millis ) );
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void start_polclock()
|
|
|
|
|
{
|
2018-10-22 20:29:55 +02:00
|
|
|
Clib::SpinLockGuard guard( polclock_lock );
|
|
|
|
|
polclock_base = PolClock::now();
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void pause_polclock()
|
|
|
|
|
{
|
2018-10-22 20:29:55 +02:00
|
|
|
Clib::SpinLockGuard guard( polclock_lock );
|
|
|
|
|
polclock_paused_at = PolClock::now();
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void restart_polclock()
|
|
|
|
|
{
|
2018-10-22 20:29:55 +02:00
|
|
|
Clib::SpinLockGuard guard( polclock_lock );
|
|
|
|
|
polclock_base += PolClock::now() - polclock_paused_at;
|
|
|
|
|
polclock_paused_at = PolClock::time_point( PolClock::duration( 0 ) );
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
polclock_t polclock()
|
|
|
|
|
{
|
2018-10-22 20:29:55 +02:00
|
|
|
Clib::SpinLockGuard guard( polclock_lock );
|
|
|
|
|
return std::chrono::duration_cast<polclock_t_unit>( PolClock::now() - polclock_base ).count() /
|
|
|
|
|
10;
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void start_poltime()
|
|
|
|
|
{
|
2018-10-22 20:29:55 +02:00
|
|
|
Clib::SpinLockGuard guard( polclock_lock );
|
|
|
|
|
poltime_base = PolClock::now();
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
void pause_poltime()
|
|
|
|
|
{
|
2018-10-22 20:29:55 +02:00
|
|
|
Clib::SpinLockGuard guard( polclock_lock );
|
|
|
|
|
poltime_paused_at = PolClock::now();
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
void restart_poltime()
|
|
|
|
|
{
|
2018-10-22 20:29:55 +02:00
|
|
|
Clib::SpinLockGuard guard( polclock_lock );
|
|
|
|
|
poltime_base += PolClock::now() - poltime_paused_at;
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
|
2018-10-22 20:29:55 +02:00
|
|
|
poltime_t poltime()
|
2016-02-19 19:26:35 +01:00
|
|
|
{
|
2018-10-22 20:29:55 +02:00
|
|
|
Clib::SpinLockGuard guard( polclock_lock );
|
|
|
|
|
return std::chrono::duration_cast<poltime_t_unit>( PolClock::now() - poltime_base ).count();
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void start_pol_clocks()
|
|
|
|
|
{
|
|
|
|
|
static bool inited = false;
|
|
|
|
|
if ( !inited )
|
|
|
|
|
{
|
|
|
|
|
inited = true;
|
|
|
|
|
start_polclock();
|
|
|
|
|
start_poltime();
|
2016-02-11 22:54:43 +01:00
|
|
|
}
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
|
|
|
|
void pause_pol_clocks()
|
|
|
|
|
{
|
|
|
|
|
pause_polclock();
|
|
|
|
|
pause_poltime();
|
|
|
|
|
}
|
|
|
|
|
void restart_pol_clocks()
|
|
|
|
|
{
|
|
|
|
|
restart_polclock();
|
|
|
|
|
restart_poltime();
|
|
|
|
|
}
|
2018-10-22 20:29:55 +02:00
|
|
|
|
|
|
|
|
bool is_polclock_paused_at_zero()
|
|
|
|
|
{
|
|
|
|
|
Clib::SpinLockGuard guard( polclock_lock );
|
|
|
|
|
return polclock_paused_at == PolClock::time_point( PolClock::duration( 0 ) );
|
|
|
|
|
}
|
2016-02-19 19:26:35 +01:00
|
|
|
}
|
2018-01-29 21:55:48 +01:00
|
|
|
}
|