Adds some more functionality to the TimeUtils class.

This commit is contained in:
zontreck 2024-09-03 03:26:26 -07:00
parent 05cee1da36
commit c25d0174ea
3 changed files with 66 additions and 2 deletions

View file

@ -144,3 +144,67 @@ class Time {
return "${builder}";
}
}
/// Provides some functionality dart lacks internally.
///
/// WARNING: A potential race condition can be met by using the nano time here.
///
/// Long run times may eventually reach a maximum possible value. To prevent this, code should make use of the resetNanoTime function.
class TimeUtils {
/// This locks the internal timer and stops execution
bool _tslock = false;
int _ns = 0;
TimeUtils._();
static TimeUtils? _inst;
factory TimeUtils() {
_inst ??= TimeUtils._();
return _inst!;
}
/// Returns a unix timestamp
static int getUnixTimestamp() {
return (DateTime.now().millisecondsSinceEpoch / 1000).round();
}
/// Converts a unix timestamp back into DateTime format.
static DateTime parseTimestamp(int unixTimestamp) {
return DateTime.fromMillisecondsSinceEpoch(unixTimestamp * 1000);
}
/// Starts the time tracker.
static void initTimeTracker() {
TimeUtils tu = TimeUtils();
tu._tslock = false;
tu._timeLoop();
}
/// Stops the time tracker
static void stopTimeTracker() {
TimeUtils tu = TimeUtils();
tu._tslock = true;
}
/// Resets the currently tracked nanoTime.
static void resetNanoTime() {
TimeUtils tu = TimeUtils();
tu._ns = 0;
}
/// This is the loop which will keep a facsimile of nanoseconds since start.
Future<void> _timeLoop() async {
_ns = 0;
while (!_tslock) {
await Future.delayed(
Duration(microseconds: 1)); // Simulate 1 microsecond delay
_ns += 1000; // Increment by 1000 nanoseconds (1 microsecond)
}
}
/// Returns the current simulated nanotime.
static int getNanoTime() {
TimeUtils tu = TimeUtils();
return tu._ns;
}
}