bevy/release-content/migration-guides/replace_non_send_resources.md
Joshua Holmes 8010185275
Make GILRS and WINIT_WINDOWS public (#19575)
After removing `!Send` resources, `GILRS` and `WINIT_WINDOWS` were not
made public, which is a breaking change. This was brought up in a
[comment on that
PR](https://github.com/bevyengine/bevy/pull/18386#issuecomment-2954209010).
This PR makes them public.

Fixes #19540.
2025-06-12 20:05:00 +00:00

2.1 KiB

title pull_requests
Replace `Gilrs`, `AccessKitAdapters`, and `WinitWindows` resources
18386
17730
19575

NonSend Resources Replaced

As an effort to remove !Send resources in Bevy, we replaced the following resources:

  • Gilrs - For wasm32 only, other platforms are unchanged - Replaced with bevy_gilrs::GILRS
  • WinitWindows - Replaced with bevy_winit::WINIT_WINDOWS
  • AccessKitAdapters - Replaced with bevy_winit::ACCESS_KIT_ADAPTERS

Each of these are now using thread_locals to store the data and are temporary solutions to storing !Send data. Even though thread_locals are thread safe, they should not be accessed from other threads. If they are accessed from other threads, the data will be uninitialized in each non-main thread, which isn't very useful.

Here is an example of how the data can now be accessed. This example will use WINIT_WINDOWS as an example, but the same technique can be applied to the others:

Immutable Access

use bevy_winit::WINIT_WINDOWS;

...

WINIT_WINDOWS.with_borrow(|winit_windows| {
    // do things with `winit_windows`
});

Mutable Access

use bevy_winit::WINIT_WINDOWS;

...

WINIT_WINDOWS.with_borrow_mut(|winit_windows| {
    // do things with `winit_windows`
});

If a borrow is attempted while the data is borrowed elsewhere, the method will panic.

NonSend Systems

Previously, the use of a !Send resource in a system would force the system to execute on the main thread. Since !Send resources are removed in Bevy, we needed to create a new way to prevent systems from running on non-main threads. To do this, you can now use bevy_ecs::system::NonSendMarker as a system parameter:

use bevy_ecs::system::NonSendMarker;

fn my_system(
    _non_send_marker: NonSendMarker,
) {
    ACCESS_KIT_ADAPTERS.with_borrow_mut(|adapters| {
        // do things with adapters
    });
}

To prevent a panic, if any of the !Send resource replacements mentioned in this document are used in a system, the system should always be marked as !Send with bevy_ecs::system::NonSendMarker.