From cecc822777b6979ff34ffd55c03a1601fea04cfc Mon Sep 17 00:00:00 2001 From: server Date: Tue, 14 Apr 2026 07:12:27 +0200 Subject: [PATCH] runtime: encapsulate checkpoint progress state --- src/libthecore/main.cpp | 3 +-- src/libthecore/main.h | 4 +--- src/libthecore/signal.cpp | 42 +++++++++++++++++++++++++++++++++++++-- src/libthecore/signal.h | 12 ++++++++++- tests/smoke_auth.cpp | 15 ++++++++++++++ 5 files changed, 68 insertions(+), 8 deletions(-) diff --git a/src/libthecore/main.cpp b/src/libthecore/main.cpp index 986fb3c..b31b540 100644 --- a/src/libthecore/main.cpp +++ b/src/libthecore/main.cpp @@ -6,7 +6,6 @@ LPHEART thecore_heart = NULL; std::atomic shutdowned = FALSE; -std::atomic tics = 0; unsigned int thecore_profiler[NUM_PF]; static int pid_init(void) @@ -115,5 +114,5 @@ int thecore_is_shutdowned(void) void thecore_tick(void) { - ++tics; + signal_mark_progress(); } diff --git a/src/libthecore/main.h b/src/libthecore/main.h index a565d0e..60e4727 100644 --- a/src/libthecore/main.h +++ b/src/libthecore/main.h @@ -2,7 +2,6 @@ #include -extern std::atomic tics; extern std::atomic shutdowned; #include "heart.h" @@ -27,5 +26,4 @@ float thecore_time(void); float thecore_pulse_per_second(void); int thecore_is_shutdowned(void); -void thecore_tick(void); // tics 증가 - +void thecore_tick(void); // checkpoint progress 증가 diff --git a/src/libthecore/signal.cpp b/src/libthecore/signal.cpp index 2856993..24167ab 100644 --- a/src/libthecore/signal.cpp +++ b/src/libthecore/signal.cpp @@ -1,9 +1,32 @@ #include "stdafx.h" +#include + +namespace +{ +std::atomic s_checkpoint_ticks { 0 }; + +const char* signal_checkpoint_backend_name_impl(ECheckpointBackend backend) +{ + switch (backend) + { + case CHECKPOINT_BACKEND_NONE: + return "none"; + case CHECKPOINT_BACKEND_VIRTUAL_TIMER: + return "virtual-timer"; + default: + return "unknown"; + } +} +} + #ifdef OS_WINDOWS void signal_setup() {} void signal_timer_disable() {} void signal_timer_enable(int timeout_seconds) {} +void signal_mark_progress() {} +ECheckpointBackend signal_checkpoint_backend() { return CHECKPOINT_BACKEND_NONE; } +const char* signal_checkpoint_backend_name(ECheckpointBackend backend) { return signal_checkpoint_backend_name_impl(backend); } #else #define RETSIGTYPE void @@ -16,13 +39,13 @@ RETSIGTYPE reap(int sig) RETSIGTYPE checkpointing(int sig) { - if (!tics.load()) + if (!s_checkpoint_ticks.load()) { sys_err("CHECKPOINT shutdown: tics did not updated."); abort(); } else - tics.store(0); + s_checkpoint_ticks.store(0); } @@ -81,4 +104,19 @@ void signal_setup(void) signal(SIGUSR1, usrsig); } +void signal_mark_progress() +{ + s_checkpoint_ticks.fetch_add(1, std::memory_order_relaxed); +} + +ECheckpointBackend signal_checkpoint_backend() +{ + return CHECKPOINT_BACKEND_VIRTUAL_TIMER; +} + +const char* signal_checkpoint_backend_name(ECheckpointBackend backend) +{ + return signal_checkpoint_backend_name_impl(backend); +} + #endif diff --git a/src/libthecore/signal.h b/src/libthecore/signal.h index 94ed277..b64a627 100644 --- a/src/libthecore/signal.h +++ b/src/libthecore/signal.h @@ -1,4 +1,14 @@ #pragma once + +enum ECheckpointBackend +{ + CHECKPOINT_BACKEND_NONE = 0, + CHECKPOINT_BACKEND_VIRTUAL_TIMER = 1, +}; + void signal_setup(); void signal_timer_disable(); -void signal_timer_enable(int timeout_seconds); \ No newline at end of file +void signal_timer_enable(int timeout_seconds); +void signal_mark_progress(); +ECheckpointBackend signal_checkpoint_backend(); +const char* signal_checkpoint_backend_name(ECheckpointBackend backend); diff --git a/tests/smoke_auth.cpp b/tests/smoke_auth.cpp index 5ab5297..55ee502 100644 --- a/tests/smoke_auth.cpp +++ b/tests/smoke_auth.cpp @@ -10,6 +10,7 @@ #include "game/stdafx.h" #include "game/SecureCipher.h" #include "libthecore/fdwatch.h" +#include "libthecore/signal.h" namespace { @@ -309,6 +310,19 @@ void TestFdwatchBackendMetadata() fdwatch_delete(fdw); } +void TestCheckpointBackendMetadata() +{ +#ifdef OS_WINDOWS + Expect(signal_checkpoint_backend() == CHECKPOINT_BACKEND_NONE, "Expected no checkpoint backend on Windows"); + Expect(std::strcmp(signal_checkpoint_backend_name(signal_checkpoint_backend()), "none") == 0, + "Unexpected checkpoint backend name on Windows"); +#else + Expect(signal_checkpoint_backend() == CHECKPOINT_BACKEND_VIRTUAL_TIMER, "Expected virtual timer checkpoint backend"); + Expect(std::strcmp(signal_checkpoint_backend_name(signal_checkpoint_backend()), "virtual-timer") == 0, + "Unexpected checkpoint backend name"); +#endif +} + void TestFdwatchSlotReuseAfterDelete() { int sockets_a[2] = { -1, -1 }; @@ -358,6 +372,7 @@ int main() TestSecureCipherRoundTrip(); TestSocketAuthWireFlow(); TestFdwatchBackendMetadata(); + TestCheckpointBackendMetadata(); TestFdwatchReadAndOneshotWrite(); TestFdwatchSlotReuseAfterDelete(); std::cout << "metin smoke tests passed\n";