Commit Graph
65 Commits
Author SHA1 Message Date
libretroadmin f1208a7a5a Make threading lock-free
The core and the headless tools no longer use mutexes, condition variables,
spinlocks, std::atomic, std::thread or volatile flags. Threads hand off through
libretro-common's retro_atomic and rthreads plus a few small pieces on top of
them in Common/Thread: Thread, MpscQueue, EventCounter, ParkingLot waits and
ReaderGate. Every wait blocks until it's woken; nothing polls on a timer.

State that only one thread touches just loses its lock. The PSP filesystem,
sceIo and the savedata dialog now belong to the emulation thread: async reads
and writes run when they're queued and complete later in emulated time, and
the IO and savedata threads are gone. The friend finder only talks to the
adhoc server and hands what it gets to the emulation thread. GPU init always
runs on the thread that starts the game.

The Vulkan render and compile queues, pipeline and render pass caches, delete
list and SPIR-V cache, the GL render queue, the software renderer's jit caches,
the file loader caches, the web debugger, UPnP, input, savestates, logging and
the GE debugger all hand off through queues and atomics. The IR jit's spinning
profiler thread goes.

A CPU thread with nothing to run now sleeps until work is queued instead of
spinning. Headless with --debugger waits for a client while stopped, and ends
the run once every client that connected has left. Web server shutdown keeps
servicing the CPU queue until the server has finished.
2026-10-09 04:56:16 +02:00
libretroadmin f0b97a2e90 Remove the standalone frontends
The libretro core is the frontend, and the headless tools are the test and
debugging hosts. The Windows, UWP, Android, iOS, macOS and SDL apps, the UI
framework and imgui go, along with what only they used: the Win32 debugger
hooks (g_frameMutex, the shutdown lock), JNI thread attachment, the Android
text drawer, RAIntegration, Discord, recent files, game installs, tilt input,
the audio resamplers, the control mapper, memstick moving and the remote ISO
and upload server modes. The web server keeps the debugger. The MSVC, Gradle
and ndk-build projects go too.
2026-10-09 04:56:10 +02:00
libretroadmin 9f13f0f051 Remove sleeps and timed polling from the emulation and render paths
The core no longer sleeps to pace itself: the frontend runs retro_run at
its own rate, so the frame throttle, the idle-vblank delay and the real
clock sync event (and its core option) are gone, and a stepping CPU hands
straight back instead of waiting 2 ms. Waits that polled now park on a
lock-free eventcount through Common/Thread/ParkingLot and are woken by
whoever changes the state: a paused GL emu thread, which also queues a
marker behind its last frame so pausing runs the render queue up to it
instead of polling; async I/O results; the software renderer when its
queue is full; Vulkan pipeline compiles; and debugger requests once
stepping ends. Boot joins the loader thread, cache shutdown joins its
read-ahead thread, and the slow-I/O simulation is removed.

The path browser, the HTTP and WebSocket servers, the Windows console and
the game info cache are left out of the core build. libretro/test gains
lrgltest, which drives the GL backend on a surfaceless EGL context through
every path that pauses or stops the emu thread; run.sh and the image
checks CI job run it on llvmpipe.
2026-10-08 17:58:42 +02:00
Henrik RydgårdandClaude Opus 5 e6fa47291d Log: give the printf output the same format as the others
Headless is the only thing that uses it, and it had its own shorter format with
no thread, file or line, so a pattern that matched a log from the app quietly
matched nothing in one from headless. Costs a wrong conclusion the first time
you do it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-18 09:45:11 -06:00
Henrik RydgårdandClaude Opus 5 e26e2d28a0 Let more than one thing receive the log stream at a time
The log manager had a single external-callback slot, but the WebSocket
debugger registers one per *connection* - LogBroadcaster is a local in the
per-connection handler. So with two clients attached (the bundled JS debugger
in a browser and Tools/wsdbg, say) the second one to connect silently took the
log stream away from the first, and then whichever disconnected first cleared
the slot and stopped delivery to the other as well. A one-shot wsdbg command is
enough to do it: connect, take the stream, exit, and the long-lived listener
that was watching the log goes quiet with nothing to say why.

Make it a list with add/remove by handle. The dispatch loop holds the lock
across the callbacks so a listener can't be freed while one is running - which
is what lets LogBroadcaster delete its listener straight after removing it.
Enabling and disabling LogOutput::ExternalCallback belongs to the list now, and
disabling only happens when the last callback goes away.

libretro registers one of these too, and never removes it; it just moves to the
new call. It can't actually collide with the debugger - the libretro build
doesn't compile Core/Debugger/WebSocket at all - but there's no reason for it
to keep using an API that only has room for one caller.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 15:23:50 -06:00
Henrik Rydgård c6061aebca Debugger: don't persist log.channel.set changes to the saved config
log.channel.set is meant for temporary, session-only diagnostic
tweaks (e.g. quieting a noisy channel while investigating something
over the WebSocket debugger). It was going through the same
SetLogLevel/SetEnabled calls the UI settings use, so a normal app
exit would persist whatever channels/levels the debugger last left
set, silently overwriting the user's real saved log preferences for
future runs - discovered when a later session's default logging
looked "off" for no apparent reason.

LogManager now tracks whether the debugger has touched channel
config this run and skips SaveConfig() entirely if so, leaving
whatever's already on disk untouched.
2026-08-21 10:32:21 +02:00
Henrik Rydgård 04ef18a9d9 Send the crash dump output to the debug output stream in headless. This makes it so that crash-failed test output will contain crash details.
Also fix some warnings and stuff.
2026-08-11 22:36:47 +02:00
Henrik RydgårdandClaude Sonnet 5 78b25599f3 ConsoleListener: fix crash if useThread_ is ever set false
hTriggerEvent/criticalSection/logPending_ were only initialized when
useThread_ was true, but Log() falls back to SendToThread() (which
uses all three) whenever the console isn't open yet, regardless of
useThread_. With useThread_ false, that meant an uninitialized
CRITICAL_SECTION and a null logPending_ write. Dead path today (only
reachable via a commented-out line), but now initializes unconditionally.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L4QAoxV2KY7ek4PcZw3WvY
2026-08-09 19:03:28 +02:00
Henrik RydgårdandClaude Sonnet 5 1c0e5ae48c LogManager: fix fp_ race between logging and SetFileLogPath/Shutdown
SetFileLogPath() and Shutdown() closed/reassigned fp_ without holding
logFileLock_, while LogLine() only locked around the actual fprintf,
after already reading fp_ unlocked. A concurrent SetFileLogPath() or
Shutdown() could close the FILE* mid-write from another thread. Now
all three paths hold logFileLock_ across the check-and-use of fp_.
Also fixes fp_ being left dangling (non-null but closed) if
SetFileLogPath() runs while File output is disabled.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L4QAoxV2KY7ek4PcZw3WvY
2026-08-09 19:03:28 +02:00
Henrik Rydgård 683704d61d Add new log category for config 2026-07-30 10:03:15 +02:00
Henrik Rydgård e30b90e709 Quiet and improve some logs 2026-07-27 18:37:28 +02:00
Henrik Rydgård 4bf36fc7f8 Add command line option --vsh to try to boot the VSH. Logspam reduction, improve printf logs. 2026-07-27 14:58:59 +02:00
Henrik Rydgård ee1314f803 Add new TexCache logging channel 2026-07-18 11:57:56 +02:00
Henrik Rydgård 95ce95e489 Add a new "Net" log category, do assorted cleanup 2026-06-13 14:43:59 +02:00
Henrik Rydgård b164621606 Add lock to RingbufferLog 2026-06-01 10:49:45 +02:00
Henrik Rydgård 91b3741a57 Implement a simple cheat database download facility 2026-05-16 22:31:13 +02:00
Henrik Rydgård 2428b58eee In Debug android builds, force logging on so we have it on the memstick setup screen. Minor tweaks. 2026-05-11 11:45:04 +02:00
Henrik Rydgård b7f257152d Fix logging to file
Fixes #21411
2026-03-11 14:14:58 +01:00
Henrik Rydgård 2c0bdcf678 InstallZipScreen improvements, small cleanup 2026-02-10 11:34:59 +01:00
刘皓 5716cbd41d Use the libretro VFS interface in libretro builds 2026-01-01 00:24:01 -05:00
Henrik Rydgård 14ddad5ce3 Change how defaults work in the inifile reader (more flexible this way) 2025-10-31 21:57:52 +01:00
oltolm de3abcf579 fix compiler warnings 2025-09-19 11:36:11 +02:00
Henrik Rydgård 44902bffdd Make logging work in these callbacks, and clarify the future solution 2025-09-05 10:31:27 +02:00
Henrik Rydgård 8e4ae1c067 LogManager: Fix bug where we accidentally opened a log file even if not enabled. 2025-09-01 00:15:04 +02:00
Henrik Rydgård b5595ea450 Add simple imgui log window (just reads the short log ring buffer) 2025-08-29 00:04:54 +02:00
Henrik Rydgård 18ccef1bd4 Just some minor code modernization 2025-08-25 10:45:12 +02:00
Henrik Rydgård 1b13af6f81 In debug builds, also default new logs to ERROR 2025-06-24 21:36:04 +02:00
Henrik Rydgård 43e79aba55 Give Mpeg and Atrac their own log categories 2025-06-24 21:36:04 +02:00
Henrik Rydgård a721a0b6dd Minor refactor 2025-06-16 18:29:38 +02:00
Henrik Rydgård 2feaeef837 Add support for 16kb page size on Android 2025-06-10 16:16:13 +02:00
Henrik Rydgård a4b2a6051c Correct the position of a mutex lock in logging 2025-06-06 19:36:43 +02:00
Henrik Rydgård 2bc181104b Sanity checks 2025-05-28 11:01:15 +02:00
Henrik Rydgård f0b0457fea More minor fixes 2025-05-26 19:40:31 +02:00
Henrik Rydgård 65229026bb Add a checkbox to enable file logging from the UI, in developer settings.
Fixes issue #20372.

The file is written to PSP/SYSTEM/DUMP/log.txt by default, but you can
override from the command line if needed.
2025-05-25 18:54:30 +02:00
Henrik Rydgård 2dbb54667d IAP work 2025-05-25 11:22:04 +02:00
Henrik Rydgård 91bf4d5b5c Correct some log categories, add UI category, some warning fixes 2025-04-09 13:45:21 +02:00
Henrik Rydgård f168aa3aee Some cleanup, make the DevTools LogView work slightly better. Though, it needs more work. 2025-04-09 11:58:31 +02:00
Henrik Rydgård 5b8f3807d1 Add new sceReg log category 2025-04-03 21:15:09 +02:00
Henrik Rydgård 0ecd72416b Reduce overhead of logging further. 2025-03-25 23:09:11 +01:00
Henrik Rydgård 8e3df92aff Avoid formatting log messages in more cases. 2025-03-25 22:42:48 +01:00
oltolm 02e767866a fix compiler warnings 2025-02-22 14:15:15 +01:00
Henrik Rydgård 7a0ec74c32 Merge pull request #19855 from oltolm/cmake
make compile with Clang/GCC on Windows
2025-01-17 15:13:52 +01:00
oltolm 9566065455 make compile on mingw-w64 2025-01-11 01:25:27 +01:00
Henrik Rydgård 5091ea57d4 Default logging in debug builds too to INFO. DEBUG is too spammy. 2025-01-10 20:47:22 +01:00
Henrik Rydgård 4dd3621fa0 Remove some unnecessary <algorithm> includes. 2024-12-18 17:04:27 +01:00
Henrik Rydgård c1ffebf54c Fix some logic in LogManager, cocoa warning fix 2024-12-17 20:22:58 +01:00
Henrik Rydgård e567a58684 Remove StdioListener 2024-12-16 12:33:58 +01:00
Henrik Rydgård 8de30235f2 More cleanup. Make the log manager work even before "initialized", removng the Early phase 2024-12-16 12:33:58 +01:00
Henrik Rydgård 96cab3f267 Rework the log manager to be more robust 2024-12-16 12:33:58 +01:00
Henrik Rydgård bf3e1b4ee1 Add Debugger log category 2024-12-10 09:59:08 +01:00