Scheduler: switch to steady-clock

Obviously the better choice and a perfect fit for our requirements;
while the system-clock may jump and even move backwards on time service
adjustments, the steady clock just counts the ticks since last boot.

In libStdC++ both are implemented as int64_t and use nanoseconds resolution
This commit is contained in:
Fischlurch 2023-10-28 20:55:28 +02:00
parent 6166ab63f2
commit 4e9d54e6f9
4 changed files with 216 additions and 38 deletions

View file

@ -22,25 +22,26 @@
/** @file real-clock.cpp
** Implementation of simplified access to the current wall clock time.
**
** @todo just a rough draft as of 2012 / 2017
** @todo the idea was that the vault has elaborate knowledge about
** timings and time progression; upper layers should thus be able
** to fulfil their timing needs by querying the vault layer
** Implementation of simplified access to current system time.
** Actually, a _steady clock_ is employed, with an unspecified base time,
** typically starting anew at each system boot. The micro-tick value will
** increase monotonously, without gaps at NTP corrections, but also without
** any relation to an external world time.
*/
#include "vault/real-clock.hpp"
#include <ctime>
#include <chrono>
using lib::time::FSecs;
using std::chrono::steady_clock;
using std::chrono::microseconds;
using std::chrono::floor;
namespace vault {
#define MICRO_TICS_PER_NANOSECOND (1000*1000*1000 / TimeValue::SCALE)
/** events during the last ms are considered "recent" for the purpose of testing */
@ -50,17 +51,12 @@ namespace vault {
TimeValue
RealClock::_readSystemTime()
{
timespec now;
clock_gettime(CLOCK_REALTIME, &now);
////////////////////////////////////////////TODO shouldn't that be CLOCK_MONOTONIC ?
////////////////////////////////////////////TODO (what happens on ntp adjustments?)
////////////////////////////////////////////TICKET #886
auto now = steady_clock::now();
auto microTicks = floor<microseconds> (now.time_since_epoch())
.count();
gavl_time_t ticksSince1970 = now.tv_sec * TimeValue::SCALE
+ now.tv_nsec / MICRO_TICS_PER_NANOSECOND;
ENSURE (ticksSince1970 == _raw(TimeValue{ticksSince1970}));
return TimeValue::buildRaw_(ticksSince1970); // bypassing the limit check
ENSURE (microTicks == _raw(TimeValue{microTicks}));
return TimeValue::buildRaw_(microTicks); // bypassing the limit check
}

View file

@ -26,12 +26,9 @@
** system clock with a sufficient level of precision. The result is
** delivered in lumiera's [internal time format](\ref lib::time::Time)
**
** @todo As of 4/23, still just a draft, but considered an established feature
** @todo this might be a good candidate also to provide some kind of
** translation service, i.e. a grid to anchor a logical time value
** with actual running wall clock time.
** @todo not clear if this becomes some kind of central service (singleton)
** or just a bunch of library routines
**
** @see lib/time/timevalue.hpp
*/
@ -52,7 +49,7 @@ namespace vault {
/**
* Convenience frontend to access the current wall clock time
* Convenience frontend to access the current raw system time
*/
class RealClock
{
@ -63,7 +60,7 @@ namespace vault {
static Time
now()
{
return Time(_readSystemTime());
return Time{_readSystemTime()};
}
static bool

View file

@ -227,8 +227,8 @@ namespace test {
pullWork();
CHECK (wasInvoked(start)); // Result: the first invocation happened immediately
CHECK (slip_us < 300);
CHECK (delay_us > 900); // yet this thread was afterwards kept in sleep to await the next one
CHECK (activity::PASS == res); // instruction to re-invoke immediately
CHECK (delay_us > 900); // yet this thread was afterwards kept in sleep to await the next task;
CHECK (activity::PASS == res); // returns instruction to re-invoke immediately
CHECK (not scheduler.empty()); // since there is still work in the queue
start += t1ms; // (just re-adjust the reference point to calculate slip_us)

View file

@ -82232,9 +82232,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1698286228019" ID="ID_1492651640" MODIFIED="1698453144418" TEXT="acquire ist korrekt (nochmal &#xfc;berpr&#xfc;ft)">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1698286180725" ID="ID_1291141353" MODIFIED="1698453149250" TEXT="sicherstellen da&#xdf; es am Ende gedropped wurde">
<node COLOR="#338800" CREATED="1698286180725" ID="ID_1291141353" MODIFIED="1698519398914" TEXT="sicherstellen da&#xdf; es am Ende gedropped wurde">
<linktarget COLOR="#688d8e" DESTINATION="ID_1291141353" ENDARROW="Default" ENDINCLINATION="143;518;" ID="Arrow_ID_94494002" SOURCE="ID_271809731" STARTARROW="None" STARTINCLINATION="760;60;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1698453150435" ID="ID_63679617" MODIFIED="1698453154138" TEXT="try-catch">
<node COLOR="#338800" CREATED="1698453150435" ID="ID_63679617" MODIFIED="1698518437666" TEXT="try-catch">
<linktarget COLOR="#fdd8ba" DESTINATION="ID_63679617" ENDARROW="Default" ENDINCLINATION="323;67;" ID="Arrow_ID_1338247781" SOURCE="ID_1793076416" STARTARROW="None" STARTINCLINATION="881;61;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#435e98" CREATED="1698453154962" ID="ID_1484610310" MODIFIED="1698454206723" TEXT="Abk&#xfc;rzung: weiter halten wenn PASS">
@ -82312,13 +82314,35 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="bell"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372042164" ID="ID_1272410719" MODIFIED="1698372168803" TEXT="Clock-Implementierung">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372415522" ID="ID_932191846" MODIFIED="1698372446765" TEXT="steady_clock verwenden">
<node COLOR="#338800" CREATED="1698372042164" ID="ID_1272410719" MODIFIED="1698518605438" TEXT="Clock-Implementierung">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1698372415522" ID="ID_932191846" MODIFIED="1698518065927" TEXT="steady_clock verwenden">
<icon BUILTIN="yes"/>
<node CREATED="1698509039012" ID="ID_1107882116" MODIFIED="1698509183027" TEXT="Umst&#xe4;nde zur Entscheidung">
<arrowlink COLOR="#5462be" DESTINATION="ID_644665778" ENDARROW="Default" ENDINCLINATION="-1222;187;" ID="Arrow_ID_31881734" STARTARROW="None" STARTINCLINATION="-1305;116;"/>
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372425329" ID="ID_291517829" MODIFIED="1698372449644" TEXT="k&#xf6;nnte man auch in vault::RealClock einbauen">
<node COLOR="#435e98" CREATED="1698508991193" FOLDED="true" ID="ID_600537205" MODIFIED="1698518063146" TEXT="Stand(libstdc++ 8)">
<node CREATED="1698518008302" ID="ID_1141108351" MODIFIED="1698518018620" TEXT="beide int64_t"/>
<node CREATED="1698518019253" ID="ID_67183502" MODIFIED="1698518026079" TEXT="nanosekunden-Skala"/>
<node CREATED="1698518031779" ID="ID_1418941928" MODIFIED="1698518054504" TEXT="high_resolution_clock &#x2261; Alias f&#xfc;r system_clock"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1698372425329" ID="ID_291517829" MODIFIED="1698518580882" TEXT="auch gleich in vault::RealClock eingebaut">
<icon BUILTIN="idea"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#1d5374" CREATED="1698518498042" ID="ID_1139060053" MODIFIED="1698518599573" TEXT="viel sauberer geworden dadurch">
<icon BUILTIN="ksmiletris"/>
</node>
<node CREATED="1698518510795" ID="ID_1522430325" MODIFIED="1698518576742" TEXT="und ist wohl technisch ein drop-in">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
weil beide letztlich auf den unterliegenden Systemcall gehen; die Linux-Systemclock liefert bereits Nanosekunden-Aufl&#246;sung
</p>
</body>
</html></richcontent>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698004014170" ID="ID_359097355" MODIFIED="1698203266998" TEXT="Test">
@ -82333,8 +82357,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697808056565" ID="ID_10043675" MODIFIED="1697808062704" TEXT="Fehlerbehandlung bedenken">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1697808069219" ID="ID_1793076416" MODIFIED="1697808179770" TEXT="Grooming-Token garantiert freigeben">
<arrowlink COLOR="#fe3a8d" DESTINATION="ID_240227471" ENDARROW="Default" ENDINCLINATION="1819;-50;" ID="Arrow_ID_1740525983" STARTARROW="None" STARTINCLINATION="221;16;"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697808069219" ID="ID_1793076416" MODIFIED="1698518471734" TEXT="Grooming-Token garantiert freigeben">
<arrowlink COLOR="#976781" DESTINATION="ID_240227471" ENDARROW="Default" ENDINCLINATION="1819;-50;" ID="Arrow_ID_1740525983" STARTARROW="None" STARTINCLINATION="221;16;"/>
<arrowlink COLOR="#fdd8ba" DESTINATION="ID_63679617" ENDARROW="Default" ENDINCLINATION="323;67;" ID="Arrow_ID_1338247781" STARTARROW="None" STARTINCLINATION="881;61;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#6920c0" CREATED="1697808219247" ID="ID_1041283707" MODIFIED="1697808253529" TEXT="ungekl&#xe4;rt: HALT an einzelne Worker?">
@ -86261,10 +86286,30 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1694016226184" ID="ID_1179993551" MODIFIED="1694016293267" TEXT="mu&#xdf; absolut zuverl&#xe4;sseig laufen als Letztes vor Terminieren des Thread">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1694016294919" ID="ID_240227471" MODIFIED="1694016354350" TEXT="konkrete Impl mu&#xdf; Grooming-Token freigeben (sonst Deadlock m&#xf6;glich)">
<node COLOR="#5b280f" CREATED="1694016294919" ID="ID_240227471" MODIFIED="1698518232337" TEXT="konkrete Impl mu&#xdf; Grooming-Token freigeben (sonst Deadlock m&#xf6;glich)">
<arrowlink COLOR="#88617a" DESTINATION="ID_688462252" ENDARROW="Default" ENDINCLINATION="118;-18;" ID="Arrow_ID_953966962" STARTARROW="None" STARTINCLINATION="-312;13;"/>
<linktarget COLOR="#fe3a8d" DESTINATION="ID_240227471" ENDARROW="Default" ENDINCLINATION="1819;-50;" ID="Arrow_ID_1740525983" SOURCE="ID_1793076416" STARTARROW="None" STARTINCLINATION="221;16;"/>
<icon BUILTIN="flag-yellow"/>
<linktarget COLOR="#976781" DESTINATION="ID_240227471" ENDARROW="Default" ENDINCLINATION="1819;-50;" ID="Arrow_ID_1740525983" SOURCE="ID_1793076416" STARTARROW="None" STARTINCLINATION="221;16;"/>
<icon BUILTIN="button_cancel"/>
<node COLOR="#435e98" CREATED="1698518233904" HGAP="46" ID="ID_271809731" MODIFIED="1698519398914" TEXT="anderweitig im catch(...) gel&#xf6;st" VSHIFT="13">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<ul>
<li>
das Grooming-Token wird stets on-demand im Scheduler-Code erlangt
</li>
<li>
Worker rufen diesen Code &#252;ber die work-Function auf
</li>
<li>
diese hat einen maximal generischen <font face="Monospaced" color="#6a2323">catch(...)</font>- Handler
</li>
</ul>
</body>
</html></richcontent>
<arrowlink COLOR="#688d8e" DESTINATION="ID_1291141353" ENDARROW="Default" ENDINCLINATION="143;518;" ID="Arrow_ID_94494002" STARTARROW="None" STARTINCLINATION="760;60;"/>
<icon BUILTIN="idea"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1694016398145" ID="ID_1137833465" MODIFIED="1694016416375" TEXT="dar&#xfc;ber k&#xf6;nnen auch fatale Fehler kommuniziert werden">
<icon BUILTIN="idea"/>
@ -96734,8 +96779,148 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
<node CREATED="1482365430484" ID="ID_1414724077" MODIFIED="1557498707240" TEXT="chrono">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1482365434203" ID="ID_1026694670" MODIFIED="1557498707240" TEXT="lernen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1482365434203" ID="ID_1026694670" MODIFIED="1698513237617" TEXT="lernen">
<icon BUILTIN="pencil"/>
</node>
<node COLOR="#435e98" CREATED="1698509149755" FOLDED="true" ID="ID_1398776971" MODIFIED="1698517953935" TEXT="Typen">
<icon BUILTIN="info"/>
<node CREATED="1698509762610" ID="ID_1986628839" MODIFIED="1698509766858" TEXT="chrono::duration">
<node CREATED="1698509770558" ID="ID_878634117" MODIFIED="1698509782485" TEXT="der Basis-Typ von Chono: ein Zeitintervall"/>
<node CREATED="1698509785071" ID="ID_367023996" MODIFIED="1698509794436" TEXT="ist stets eine Template-Instanz">
<node CREATED="1698509796445" ID="ID_1990722417" MODIFIED="1698509799977" TEXT="das ist etwas l&#xe4;stig"/>
<node CREATED="1698509800661" ID="ID_228113154" MODIFIED="1698509815551" TEXT="weil damit alle Funktionen jeweils zwei Template-Parameter bekommen"/>
</node>
<node CREATED="1698509856581" ID="ID_322748492" MODIFIED="1698509899658">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<div http-equiv="content-type" content="text/html; charset=utf-8">
<font face="Monospaced" size="2">template&lt;<br face="Monospaced" size="2" /></font>
<p>
<font face="Monospaced" size="2">&#160;&#160;&#160; class&#160;Rep,<br face="Monospaced" size="2" />&#160;&#160;&#160; class&#160;Period =&#160; <a href="http://en.cppreference.com/w/cpp/numeric/ratio/ratio">std::ratio</a>&lt;1&gt;<br face="Monospaced" size="2" /></font>
</p>
<font face="Monospaced" size="2">&gt;&#160;</font><font face="Monospaced" size="2" color="#391163">class&#160;<b>duration</b></font><font face="Monospaced" size="2">; </font>
</div>
</body>
</html></richcontent>
<node CREATED="1698509911262" ID="ID_820008742" MODIFIED="1698509966828" TEXT="Rep: Implementierungs-Typ">
<node CREATED="1698509921213" ID="ID_417702617" MODIFIED="1698509930368" TEXT="nur dieser Datenwert wird gespeichert"/>
<node CREATED="1698509931010" ID="ID_1755589004" MODIFIED="1698509941486" TEXT="ist ein Integer oder floating-point typ"/>
<node CREATED="1698509942730" ID="ID_651563014" MODIFIED="1698509949205" TEXT="....also letztlich &quot;numerisch&quot;"/>
</node>
<node CREATED="1698509954194" ID="ID_1878098401" MODIFIED="1698509988720" TEXT="Period: Periode">
<node CREATED="1698509990731" ID="ID_328352685" MODIFIED="1698509997087" TEXT="Ma&#xdf;einheit: Sekunden"/>
<node CREATED="1698509997554" ID="ID_1236632774" MODIFIED="1698512441560" TEXT="dargestellt als compile-Time std::ratio"/>
</node>
<node CREATED="1698511408926" ID="ID_1552020609" MODIFIED="1698511411890" TEXT="count()">
<node CREATED="1698511412838" ID="ID_1376578033" MODIFIED="1698511452668" TEXT="liefert die Darstellung als Typ Rep"/>
</node>
</node>
</node>
<node CREATED="1698512614901" ID="ID_876001560" MODIFIED="1698512619448" TEXT="time_point">
<node CREATED="1698512624972" ID="ID_512068076" MODIFIED="1698512637765" TEXT="verpackte Duration bezogen auf eine Clock-Epoch">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1698512789253" ID="ID_1996685993" MODIFIED="1698513276369" TEXT="time_since_epoch()">
<node CREATED="1698512793429" ID="ID_1961113873" MODIFIED="1698512801768" TEXT="liefert eine Duration"/>
<node CREATED="1698512778071" ID="ID_718175118" MODIFIED="1698513284295" TEXT="Zugriff auf &#xbb;Wert&#xab;"/>
</node>
<node CREATED="1698512645726" ID="ID_1612837076" MODIFIED="1698513354696" TEXT="Zugang per Umwandlungs-Funktionen">
<arrowlink COLOR="#677d8a" DESTINATION="ID_252535572" ENDARROW="Default" ENDINCLINATION="-90;-144;" ID="Arrow_ID_1740457437" STARTARROW="None" STARTINCLINATION="-164;13;"/>
</node>
</node>
<node CREATED="1698509081104" HGAP="98" ID="ID_644665778" MODIFIED="1698509183027" TEXT="Chrono: Clocks" VSHIFT="-19">
<linktarget COLOR="#5462be" DESTINATION="ID_644665778" ENDARROW="Default" ENDINCLINATION="-1222;187;" ID="Arrow_ID_31881734" SOURCE="ID_1107882116" STARTARROW="None" STARTINCLINATION="-1305;116;"/>
<icon BUILTIN="clock"/>
<node CREATED="1698509490470" ID="ID_1166354595" MODIFIED="1698509492294" TEXT="API">
<node CREATED="1698509493269" ID="ID_277517516" MODIFIED="1698509496777" TEXT="statisch: now()"/>
<node CREATED="1698511651646" ID="ID_729262634" MODIFIED="1698512331821" TEXT="constexpr static: is_steady"/>
<node CREATED="1698509497896" ID="ID_448445295" MODIFIED="1698509501488" TEXT="Typedefs">
<node CREATED="1698509507057" ID="ID_1427572973" MODIFIED="1698509510351" TEXT="chrono::duration"/>
<node CREATED="1698509544709" ID="ID_258287310" MODIFIED="1698509560210" TEXT="rep : der Implementierungs-Typ"/>
<node CREATED="1698509560812" ID="ID_590462425" MODIFIED="1698512427154" TEXT="Period als compile-Time std::ratio of 1"/>
<node CREATED="1698509614721" ID="ID_891145455" MODIFIED="1698509618696" TEXT="time_point">
<node CREATED="1698509619509" ID="ID_216113768" MODIFIED="1698509628660" TEXT="per Template-Arg an die Clock gebunden"/>
<node CREATED="1698509643003" ID="ID_555660236" MODIFIED="1698509747546">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p style="text-align: right">
<u>Beispiel steady_clock</u>
</p>
<p>
<font color="#382a6e" face="Monospaced" size="2">using time_point =&#160;chrono::time_point&lt;steady_clock, steady_clock::duration&gt;</font>
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
</node>
<node CREATED="1698509191197" ID="ID_1356397278" MODIFIED="1698509201128" TEXT="System-Clock">
<node CREATED="1698509319928" ID="ID_44478916" MODIFIED="1698509324928" TEXT="hat zus&#xe4;tzliche Funktionen">
<node CREATED="1698509341937" ID="ID_1046747441" MODIFIED="1698509351084" TEXT="Zeit Formatieren / IO"/>
<node CREATED="1698509353439" ID="ID_1183159748" MODIFIED="1698509365770" TEXT="Konv. zu time_t (f&#xfc;r C APIs)"/>
</node>
<node CREATED="1698509441280" ID="ID_217512931" MODIFIED="1698509451740" TEXT="kann Spr&#xfc;nge machen bei NTP-Adjustments"/>
<node CREATED="1698509453299" ID="ID_550403574" MODIFIED="1698509474932" TEXT="typischerweise: Nanosec since &#xbb;Unix-Epoch&#xab; (1.1.1970)"/>
</node>
<node CREATED="1698509202212" ID="ID_790803121" MODIFIED="1698509207431" TEXT="Steady-Clock">
<node CREATED="1698509208331" ID="ID_591620752" MODIFIED="1698509217401" TEXT="ist garantiert monoton wachsend"/>
<node CREATED="1698509218162" ID="ID_596220520" MODIFIED="1698509233539" TEXT="keinerlei Angaben zum Zeitnullpunkt"/>
<node CREATED="1698509274790" ID="ID_429550366" MODIFIED="1698509311899" TEXT="kann z.B. Ticks seit letztem Boot sein"/>
</node>
<node CREATED="1698511615579" ID="ID_1031342236" MODIFIED="1698511622222" TEXT="High-Resolution-Clock">
<node CREATED="1698511623066" ID="ID_943634419" MODIFIED="1698511631172" TEXT="ist etwas fragw&#xfc;rdig"/>
<node CREATED="1698511631628" ID="ID_565001872" MODIFIED="1698511644794" TEXT="da keine Festlegung, ob monotonic"/>
</node>
<node CREATED="1698508991193" ID="ID_36572696" MODIFIED="1698511601168" TEXT="Stand(libstdc++ 8)">
<icon BUILTIN="back"/>
<node CREATED="1698509386500" ID="ID_543938648" MODIFIED="1698509396728" TEXT="alle Clocks haben Nano-Ticks"/>
<node CREATED="1698509397570" ID="ID_697985650" MODIFIED="1698509405605" TEXT="rep = int64_t"/>
<node CREATED="1698509409721" ID="ID_1625495674" MODIFIED="1698509436425" TEXT="high_resolution_clock ist alias &#x27f6; System-Clock"/>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1698512950960" FOLDED="true" ID="ID_389621636" MODIFIED="1698517957017" TEXT="Umwandlungen">
<icon BUILTIN="info"/>
<node CREATED="1698513121905" ID="ID_1567041783" MODIFIED="1698513133305" TEXT="duration-Konstruktor">
<node CREATED="1698513135055" ID="ID_540706165" MODIFIED="1698513150985" TEXT="m&#xf6;glich wenn Basis-Typen direkt kompatibel"/>
<node CREATED="1698513151348" ID="ID_1794770890" MODIFIED="1698513179245" TEXT="und ganzzahliges Divisionsverh&#xe4;ltnis"/>
</node>
<node CREATED="1698513112016" ID="ID_1108519346" MODIFIED="1698513120179" TEXT="duration_cast&lt;ToDuration&gt;">
<node CREATED="1698516509446" ID="ID_1945968798" MODIFIED="1698516515393" TEXT="macht einen floor()"/>
</node>
<node CREATED="1698512955343" ID="ID_1223227649" MODIFIED="1698512969362" TEXT="timepoint_cast&lt;ToDuration&gt;"/>
<node CREATED="1698513313391" ID="ID_252535572" MODIFIED="1698513346664" TEXT="Rundungs-Umwandlungen">
<linktarget COLOR="#677d8a" DESTINATION="ID_252535572" ENDARROW="Default" ENDINCLINATION="-90;-144;" ID="Arrow_ID_1740457437" SOURCE="ID_1612837076" STARTARROW="None" STARTINCLINATION="-164;13;"/>
<node CREATED="1698512656551" ID="ID_1370779068" MODIFIED="1698516529207" TEXT="floor()"/>
<node CREATED="1698512665366" ID="ID_472310839" MODIFIED="1698516533023" TEXT="ceil()"/>
<node CREATED="1698512673517" ID="ID_117446943" MODIFIED="1698516538022" TEXT="round()"/>
<node CREATED="1698516539145" ID="ID_206449756" MODIFIED="1698516550270" TEXT="arbeitet auf duration und time_point">
<node CREATED="1698512850622" ID="ID_510318894" MODIFIED="1698516618484" TEXT="liefert dann Duration oder Time-point mit einer anderen Period / Rep"/>
</node>
<node CREATED="1698512818089" ID="ID_1130528368" MODIFIED="1698512832972" TEXT="1. Template-Parameter mandatory: ToDuration"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1698511477688" FOLDED="true" HGAP="32" ID="ID_1964801588" MODIFIED="1698517960542" TEXT="vordefinierte Skalen und Konstanten">
<icon BUILTIN="info"/>
<node CREATED="1698511502393" ID="ID_636370937" MODIFIED="1698511512348" TEXT="vordefinierte Durations">
<node CREATED="1698511513128" ID="ID_1453047706" MODIFIED="1698511515028" TEXT="seconds"/>
<node CREATED="1698511515573" ID="ID_422667456" MODIFIED="1698511518723" TEXT="milliseconds"/>
<node CREATED="1698511519215" ID="ID_1395948719" MODIFIED="1698511522880" TEXT="microseconds"/>
<node CREATED="1698511523319" ID="ID_1025078381" MODIFIED="1698511524907" TEXT="...."/>
</node>
<node CREATED="1698511529358" ID="ID_1905315767" MODIFIED="1698511545616" TEXT="vordefinierte Literal-Operatoren">
<node CREATED="1698511546844" ID="ID_810245100" MODIFIED="1698511551854" TEXT="std::chrono_literals"/>
<node CREATED="1698511552452" ID="ID_980003726" MODIFIED="1698511559006" TEXT="Literal-Schreibweise">
<node CREATED="1698511559795" ID="ID_208097384" MODIFIED="1698511561099" TEXT="10s"/>
<node CREATED="1698511561634" ID="ID_595245063" MODIFIED="1698511566629" TEXT="120ms"/>
<node CREATED="1698511567177" ID="ID_697515798" MODIFIED="1698511568124" TEXT="..."/>
</node>
</node>
</node>
<node CREATED="1482365448257" ID="ID_1648116305" MODIFIED="1557498707240">
<richcontent TYPE="NODE"><html>