Files
ppsspp/Core/Instance.h
T
Henrik RydgårdandClaude Opus 5.5 56148606e5 Headless: Keep ad hoc test instances in step in emulated time
Each instance paced itself against the wall clock, so on a busy machine
the one that got less CPU fell behind, and anything a test times across
instances (a peer leaving, a matching timeout) came out differently with
the load: pair/vanish and pair/matching3 failed on macOS CI.

With --sync-file and --sync-count, instances on one machine share a file
of one slot per instance. CoreTiming ends a slice at every emulated
millisecond, publishes it there, and waits until every other instance
has reached it too, so they're never more than a millisecond apart. It
works for any number of instances. One that stops moving (a debugger
pause, a crash) is waited for 2 s and then left out until it moves
again, and one that blocks the CPU thread in real time on something the
others must do (the relay PTP connect) stands aside meanwhile.

Tools/adhoc_multi.py and adhoc_session.py use it (--no-sync turns it
off). The host's 1 s head start is gone: they wait for the server's
port instead. adhoc_multi writes each instance's output to a file, as a
full pipe would now stop the other instances too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 09:04:00 +01:00

49 lines
1.9 KiB
C++

// Copyright (c) 2020 PPSSPP Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0 or later versions.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official git repository and contact information can be found at
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
#pragma once
#include "ppsspp_config.h"
#include <cstdint>
#include <string>
extern uint8_t PPSSPP_ID;
void InitInstanceCounter();
void ShutdownInstanceCounter();
int GetInstancePeerCount();
inline bool IsFirstInstance() {
return PPSSPP_ID == 1;
}
// Keeps several instances on one machine in step in emulated time, for ad hoc tests: each one stops
// at every emulated millisecond until all the others have reached it too, so they're never more than
// a millisecond apart, however fast each one runs. They share a file of one slot per instance (the
// launcher creates it, zero-filled, at least INSTANCE_SYNC_FILE_SIZE bytes); index is 1-based.
constexpr int INSTANCE_SYNC_FILE_SIZE = 4096;
bool InitInstanceSync(const std::string &path, int index, int count);
void ShutdownInstanceSync();
bool InstanceSyncEnabled();
// Called by CoreTiming at each emulated millisecond: publishes it and waits for the others.
void InstanceSyncReached(int64_t ms);
// Around a wait in real time on the CPU thread for something another instance has to do (the others
// would otherwise sit waiting for this one): meanwhile they run on without it, and wait for it to
// catch up afterwards.
void InstanceSyncStandAside(bool aside);