rawinput: avoid deadlock when binding analog axis as a button (#809)

## Link to GitHub Issue or related Pull Request, if one exists
Regressed by #793

## Description of change
Due to lock inversion, when binding an analog axis as a button, spice
deadlocks. Fix that.

Also create a separate `unordered_map` that keeps track of device
handles so that `WM_INPUT` handle can look up devices without having to
acquire the larger `devices_mutex` which could be held by (potentially)
lengthy operations like hotplug.

Fix more synchronization issues around hotplug. Latent bug exposed by
MIDI 2.0 issues.

## Testing
This commit is contained in:
bicarus
2026-07-18 03:09:27 -07:00
committed by GitHub
parent e1d1b39567
commit c080bbe301
8 changed files with 160 additions and 78 deletions
+28
View File
@@ -0,0 +1,28 @@
#pragma once
#include <mutex>
#include <unordered_map>
#include <windows.h>
#include "device.h"
namespace rawinput {
class RawInputHandles {
public:
struct AcquiredDevice {
Device *device = nullptr;
std::unique_lock<std::mutex> lock;
};
void add(Device *device);
void remove(Device *device);
AcquiredDevice acquire(HANDLE handle);
private:
// non-owning index; RawInputManager owns the stable device slots
std::unordered_map<HANDLE, Device *> devices;
std::mutex mutex;
};
}