runtime: encapsulate checkpoint progress state
Some checks failed
build / Linux asan (push) Has been cancelled
build / Linux release (push) Has been cancelled
build / FreeBSD build (push) Has been cancelled

This commit is contained in:
server
2026-04-14 07:12:27 +02:00
parent 3272537376
commit cecc822777
5 changed files with 68 additions and 8 deletions

View File

@@ -6,7 +6,6 @@
LPHEART thecore_heart = NULL;
std::atomic<int> shutdowned = FALSE;
std::atomic<int> 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();
}

View File

@@ -2,7 +2,6 @@
#include <atomic>
extern std::atomic<int> tics;
extern std::atomic<int> 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 증가

View File

@@ -1,9 +1,32 @@
#include "stdafx.h"
#include <atomic>
namespace
{
std::atomic<int> 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

View File

@@ -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);
void signal_timer_enable(int timeout_seconds);
void signal_mark_progress();
ECheckpointBackend signal_checkpoint_backend();
const char* signal_checkpoint_backend_name(ECheckpointBackend backend);