112 Commits
Author SHA1 Message Date
LibretroAdmin f7d5095739 Core, InputCommon, VideoCommon: remove the remaining locks
Every std::mutex, lock_guard, unique_lock, scoped_lock,
condition_variable, call_once and semaphore left in Source/Core is
replaced by a lock-free design:

- Input: the device list, control bindings, stick calibration and
  default device are published snapshots read under a quiesce; a
  rebind requested while another thread is rebinding is handed to
  that thread instead of waited for.
- WiimoteReal: the pool thread owns the slots and runs commands from
  an MPSC queue; the active Wiimotes are atomic slots.
- EXI/SI/IOS devices: socket and packet traffic goes through SPSC
  rings or MPSC handoffs owned by one thread; USB scanning publishes
  its device list, and libusb transfers drain through a CallGate.
- Memory cards: the flush thread applies change records queued by
  the CPU thread.
- Custom assets: loads are scheduled as a published batch with an
  atomic cursor, results come back over an MPSC stack, and busy
  assets are skipped and retried.
- D3D state and GL program caches use insert-only atomic maps
  (Common/AtomicHashMap.h).
- Logging appends with O_APPEND / FILE_APPEND_DATA; FatFs reports
  busy instead of waiting; per-socket WSAStartup/WSACleanup.

Deleted as unused by the libretro core: the profiler, the FIFO
recorder, the volume verifier, the touch InputOverrider and the
GameCube adapter's libusb path.
2026-11-05 20:11:31 +01:00
LibretroAdmin 767c898df8 Move every thread onto rthreads and add a lock-free parallel_for
No std::thread, std::async, std::future or std::promise is left. Each
thread is an sthread with a plain entry point: Common::ThreadEntry<&C::F>
turns a member function into one, Common::JoinThread joins and clears a
handle, and Common::StartDetachedThread covers the fire-and-forget users.

Common/ParallelFor.{h,c} (C89) runs fn(ctx, i) for i in [0, count) on a
persistent pool of one worker per extra core plus the caller. Jobs are
claimed with an atomic counter, workers park on an eventcount between
batches, and the batch hand-off is a seq_cst users/active pair, so there
is no lock anywhere. A caller that finds the pool busy runs its batch
serially instead of waiting. retro_deinit joins the pool.

- VolumeWii::HashGroup spawned 64 threads per 2 MiB group and
  EncryptGroup another one per core; both are now parallel_for batches
  on the pool. The H1/H2 tail is a few small hashes and runs inline.
- VolumeVerifier spawned up to five std::async threads per chunk; the
  chunk's tasks now go to one persistent worker that fans them out with
  parallel_for, still overlapping the next read. The Redump lookup is an
  sthread joined in Finish or the destructor.
- The dual-core "GPU thread" in Core only set a thread_local on itself
  and exited, since the frontend runs the GPU loop. It is gone, along
  with the non-libretro branches of Core.cpp.
- The emu thread is started through Core::StartEmuThread.
- CPU core counts come from cpu_features_get_core_amount().
2026-11-05 13:00:34 +01:00
Craig Carnell d02c31a877 Merge in upstream/master and resolve compiler failures from update 2026-08-07 20:58:58 +01:00
JosJuice 05855a37f4 GCAdapter: Deregister callback when scan thread exits
We were registering the hotplug callback when starting the thread, but
deregistering it when shutting down GCAdapter as a whole. Because the
thread can start and stop potentially many times before GCAdapter shuts
down, this led to callbacks being registered when we already have
callbacks. On Android, this was making Dolphin's Kotlin code for
registering the callback throw an IllegalStateException.

To fix this, deregister the callback when stopping the thread.
2026-07-12 10:20:58 +02:00
Craig Carnell 3d070f498a libretro: update to 2606 2026-06-25 09:54:48 +01:00
Dentomologist ac78e52cf9 GCAdapter: Fix data races
Make `s_is_adapter_wanted` and the elements of `s_config_rumble_enabled`
atomic.

The CPU thread reads `s_is_adapter_wanted` and `s_config_rumble_enabled`
in `Output`, while the host thread writes to them in `RefreshConfig`.

The simplest way to trigger this race is to close the `Settings` window
while playing a game with the adapter active.
2026-04-25 11:16:10 -07:00
Dentomologist a94854309b Merge pull request #14608 from JosJuice/gcadapter-auto-start
GCAdapter: Automatically start and stop thread
2026-04-24 19:51:51 -07:00
JosJuice cc01a60347 GCAdapter: Automatically start and stop thread
This keeps the logic encapsulated inside GCAdapter.cpp so callers don't
have to think about it.
2026-04-18 19:40:25 +02:00
Martino Fontana 95dec13203 Improve usage of std::move and const references parameters
Accomplished using `run-clang-tidy` with `performance-move-const-arg,performance-unnecessary-value-param,modernize-pass-by-value`.

Changed arguments to const references, removed them where inappropriate (e.g. sink parameters). Same with std::move.

Manually reviewed each change to make sure that it makes sense, and do something more appropriate if possible.
2026-04-17 12:39:46 +02:00
Julien Bernard 0e8db4fa22 Send neutral stick positions when disconnected rather than down-left 2026-02-25 23:06:50 +01:00
Julien Bernard afc2920a5f Gcc adapter fixes (hotplugging, claim retries, shutdown, bad yields) 2026-02-25 22:55:48 +01:00
Craig Carnell 7743c7e1dd Merge in upstream dolphin/master into libretro 2026-02-22 09:07:47 +00:00
Martino Fontana a14c88ba67 Remove unused imports
Yellow squiggly lines begone!
Done automatically on .cpp files through `run-clang-tidy`, with manual corrections to the mistakes.
If an import is directly used, but is technically unnecessary since it's recursively imported by something else, it is *not* removed.
The tool doesn't touch .h files, so I did some of them by hand while fixing errors due to old recursive imports.
Not everything is removed, but the cleanup should be substantial enough.
Because this done on Linux, code that isn't used on it is mostly untouched.
(Hopefully no open PR is depending on these imports...)
2026-01-25 16:12:15 +01:00
Sintendo 1e0473e44f Fix various typos and spelling mistakes 2026-01-17 20:11:38 +01:00
Jordan Woyak f9a5051bae GCAdapter: Calculate poll rate for display in UI. It's currently updated every 50 reads. 2025-11-23 02:06:39 -06:00
Craig Carnell d6d638dd60 Fix MSVC compilation due to treating warnings as errors 2025-10-16 14:06:44 -04:00
Craig Carnell 2326b0a931 iOS and tvOS compatibility changes 2025-10-14 22:54:58 +01:00
Craig Carnell 71fd149aa6 Refactor base code for libretro usage 2025-10-10 09:23:54 +01:00
Craig Carnell 22d028cbe1 Merge upsteam/master into libretro 2025-10-10 09:23:17 +01:00
JosJuice 1c7df370d9 Revert "Android/GCAdapter: Don't join current thread"
This reverts commit 74ed5e5532.
It solves a problem that no longer exists.
2025-07-27 11:21:04 +02:00
JosJuice 185569778c Android: Detect GCAdapter disconnection using BroadcastReceiver
This lets us get rid of the Reset call in ProcessInputPayload, which was
causing us some threading headaches (see 74ed5e5532). Instead we handle
disconnection in the same way as the libusb implementation does.
2025-07-27 11:21:04 +02:00
JosJuice e2e33becc9 Android: Detect GCAdapter connection using BroadcastReceiver
We can register a BroadcastReceiver to have Android tell us when a GC
adapter gets connected instead of having a loop where we continuously
call SleepCurrentThread(1000) and poll the current status. When waiting
for a GC adapter to connect, this both reduces power usage and improves
responsiveness.

Note that I made openAdapter get the UsbDevice that's been stored by the
hotplug code instead of having openAdapter find the UsbDevice on its own
like before. This is only because I want to ensure that the UsbDevice
being tracked for disconnection is the same as the UsbDevice actually
being used, in case the user has multiple adapters connected.
2025-07-27 11:21:04 +02:00
JosJuice 7508842859 Android: Clean up naming in Java_GCAdapter and Java_WiimoteAdapter
This isn't how we name things in Java/Kotlin.
2025-07-27 11:13:44 +02:00
Sanjay Govind 10e044872d LibusbDevice: Don't detach kernel drivers on macOS 2025-02-01 10:32:20 +13:00
Joshua Vandaële f1f147965b Fix segfault when passing invalid arguments 2025-01-24 20:52:33 +01:00
JosJuice 74ed5e5532 Android/GCAdapter: Don't join current thread
The read thread could call Reset, which in turn tried to join the read
thread, leading to a SIGABRT. This manifested as Dolphin consistently
crashing when disconnecting a GC adapter and having a chance of crashing
a few seconds after connecting a GC adapter.
2024-12-01 12:59:25 +01:00
mitaclaw 809766a439 Simplify std::fill with std::array::fill 2024-10-09 17:26:10 -07:00
mitaclaw eb92d6f0a8 Core::GetState: Avoid Global System Accessor 2024-04-08 16:23:23 -07:00
Jordan Woyak 719d76ab2e GCAdapter: Adjust libusb transfer timeout to 100ms. 2024-03-20 18:02:06 -05:00
Admiral H. Curtiss 07c035e659 Core/SystemTimers: Refactor to class, move to System. 2024-01-04 23:35:19 +01:00
JosJuice 7197e3abd0 Use structs for config callback IDs
This way you can't mix up regular config callback IDs and CPU thread
config callback IDs. (It would be rather bad if you did!)
2023-08-17 19:19:26 +02:00
Dentomologist 274b11e4e9 GCAdapter: Fix Android unused constant warning
CONTROLLER_OUTPUT_INIT_PAYLOAD_SIZE is only used by the libusb
implementation.
2023-08-12 20:20:42 -07:00
Dentomologist 77d33d61de GCAdapter: Fix spelling of constants 2023-08-12 20:20:41 -07:00
nyanpasu64 5d0f1bd10b Switch libusb_config_descriptor to RAII type 2023-07-05 20:38:22 -07:00
nyanpasu64 c893ccca58 Workaround GC adapter detection breaking when reset fails 2023-07-05 20:38:22 -07:00
nyanpasu64 559a16da49 Reset GC adapter upon IO error after sleep-wake
Fixes GC adapter breaking on sleep-wake on Linux and burning a full CPU
core. This is cleaner than alternative approaches.
2023-07-05 20:38:22 -07:00
nyanpasu64 afb5eff426 Don't burn a CPU core and spam logs when GC Adapter fails 2023-07-05 20:38:22 -07:00
nyanpasu64 54850e936c Fix memory leak in libusb code 2023-07-05 20:38:22 -07:00
Pokechu22 49a84cbc4c Resolve various "no previous declaration" warnings 2023-02-09 16:23:01 -08:00
Admiral H. Curtiss c9558ecb4c CoreTiming: Refactor to class. 2022-11-27 03:47:12 +01:00
Jordan Woyak 5ed0543430 GCAdapter: Process pad state in read thread and other general cleanups. 2022-10-22 00:38:59 -05:00
Pokechu22 27772e01d9 GCAdapter: Compare with LIBUSB_SUCCESS instead of 0 2022-06-08 15:30:22 -07:00
Pokechu22 15cbb5c8f9 Log warnings when LibusbUtils::GetDeviceList fails 2022-06-08 15:29:11 -07:00
Pokechu22 6823b4d7a0 GCAdapter: Use LibusbUtils::ErrorWrap in log messages 2022-06-02 19:39:36 -07:00
Pokechu22 0d8772ccbe GCAdapter: Make local variables const where possible 2022-06-02 19:39:36 -07:00
Pokechu22 cd9edeacda GCAdapter: Merge Read logic 2022-06-02 19:39:36 -07:00
Pokechu22 9ec65baf46 GCAdapter: Have the read thread control the write thread
This was done for Android in 6cc40b1235.
2022-06-02 19:39:36 -07:00
Pokechu22 0fa92694d1 GCAdapter: Exit early if the adapter fails to open on Android
This is only so that indentation is consistent with the non-android code.
2022-06-02 19:39:36 -07:00
Pokechu22 749a4ad1ef GCAdapter: Remove check on write size on android
It was removed for non-android in 56239d1ae1, and android already uses a separate thread, so presumably this isn't needed anymore.
2022-06-02 19:39:36 -07:00
Pokechu22 27947046af GCAdapter: Harmonize read/write thread variable names 2022-06-02 19:39:36 -07:00