--- nono/vm/sync.cpp 2026/04/29 17:05:10 1.1.1.1 +++ nono/vm/sync.cpp 2026/04/29 17:05:14 1.1.1.2 @@ -200,14 +200,14 @@ Sync::ChangeMode(uint32 newmode) if (newmode == 0) { // 高速モードに - putlog(2, "高速モード"); + putlog(2, "Fast mode"); // 高速モードでは RAM は直接アクセス ::direct_ram_size = gRAM->GetSize(); } else { // 同期モードに - putlog(2, "同期モード"); + putlog(2, "Sync mode"); // 同期モードでは RAM アクセスはデバイス経由 ::direct_ram_size = 0; @@ -286,7 +286,12 @@ Sync::DoSync() uint64 realslept = rtime - prev; if (realslept > diff) { uint64 over = realslept - diff; - if (over > overslept) { + if (over > 1_sec) { + // スリープ中にサスペンドされたと推定する + putlog(1, "時刻再同期(スリープ中の実時間跳躍)"); + rtime_epoch = rtime; + vtime_epoch = vtime; + } else if (over > overslept) { overslept = over; } } else if (realslept < diff) { @@ -295,10 +300,14 @@ Sync::DoSync() sync_event.time = 0; } } + } else if (rspan > vspan + overslept) { + // 実時間のほうが時間精度より進んでいれば、サスペンドとかから + // 復帰してきた状態だと推定して、基準時刻を再同期する。 + putlog(1, "時刻再同期(実行中の実時間跳躍)"); + rtime_epoch = rtime; + vtime_epoch = vtime; } else { - // 実時間のほうが進んでいれば、間に合ってない - - // XXX ここで間引き運転とか + // 同期の範囲内にいるので何もしなくていい } } } @@ -341,7 +350,7 @@ Sync::PutlogRealtime() uint64 vtime = gScheduler->GetVirtTime(); // 電源オン時からここまでの時間を表示するだけでリセット等はしない。 - putlog(0, "電源オンから %d.%03d 秒経過 %6.2f%%", + putlog(0, "Elapsed time since power-on: %d.%03d sec, %6.2f%%", (int)(rtime / (1000 * 1000 * 1000)), (int)((rtime / (1000 * 1000)) % 1000), (double)vtime / rtime * 100);