Each app writes $HOME/.cache/crafter-debug/instances/<id>.json (0600, in a 0700 directory) and holds an flock on <id>.lock while it lives. Every `flatpak run` is its own pid namespace, so pids collide and can neither name an instance nor tell whether it lives; a random id names it and the lock says it lives, since flock works across sandboxes on the shared filesystem. An app killed without its destructor leaves its files with the lock free, and the next listing removes them. The lock is created under a temporary name, locked, then renamed, as in Crafter.Review's LifetimeLock, so it is never seen unlocked while its app lives. Inside a Flatpak the record also carries the sandbox's instance id (for `flatpak enter`) and the host pid of its init (to end the whole sandbox from the host). project.cpp now generates :BuildInfo per core variant: a hash of the library's sources and the path of the client built with it. App and client share the core, so they report the same id exactly when built from the same sources; this is the safety net under building the client in the same pass as the app. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
17 lines
779 B
C++
17 lines
779 B
C++
// SPDX-License-Identifier: LGPL-3.0-only
|
|
// SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
|
|
|
|
// What the build knew: a hash of Crafter.Debug's own sources, and where the
|
|
// client built alongside this library is. project.cpp generates the
|
|
// definitions into build/generated/, so the app and the client, which share
|
|
// this core, report the same values exactly when they came from the same
|
|
// sources: the safety net under "the client is built with the app".
|
|
export module Crafter.Debug.Core:BuildInfo;
|
|
import std;
|
|
|
|
export namespace Crafter::Debug::Detail {
|
|
// 16 hex digits over every interface and implementation source.
|
|
std::string_view SourceId();
|
|
// The absolute path of the crafter-debug client this build compiled.
|
|
std::string_view ClientPath();
|
|
}
|