From 613bd8854816bbdea93128c6f41e6ceef853ce09 Mon Sep 17 00:00:00 2001 From: Kevin Cooney Date: Fri, 27 Feb 2026 12:42:40 -0800 Subject: [PATCH] [wpilib] Make Preferences Listener not depend on mutable fields (#8607) The Listener installed by Preferences was referencing m_typePublisher which could be modified by a future call to setNetworkTableInstance(). Instead, reference a local. Also made Topic.m_handle final, to guarantee that Topic.equals() is thread-safe, and still work after the publisher has been closed. --- ntcore/src/main/java/edu/wpi/first/networktables/Topic.java | 4 ++-- .../src/main/java/edu/wpi/first/wpilibj/Preferences.java | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ntcore/src/main/java/edu/wpi/first/networktables/Topic.java b/ntcore/src/main/java/edu/wpi/first/networktables/Topic.java index ae548c52ae..05ed5752ff 100644 --- a/ntcore/src/main/java/edu/wpi/first/networktables/Topic.java +++ b/ntcore/src/main/java/edu/wpi/first/networktables/Topic.java @@ -330,8 +330,8 @@ public class Topic { } /** NetworkTables instance. */ - protected NetworkTableInstance m_inst; + protected final NetworkTableInstance m_inst; /** NetworkTables handle. */ - protected int m_handle; + protected final int m_handle; } diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/Preferences.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/Preferences.java index 28dde09e2a..a33ce23c38 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/Preferences.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/Preferences.java @@ -83,6 +83,8 @@ public final class Preferences { if (m_listener != null) { m_listener.close(); } + + Topic typePublisherTopic = m_typePublisher.getTopic(); m_listener = NetworkTableListener.createListener( m_tableSubscriber, @@ -90,8 +92,8 @@ public final class Preferences { event -> { if (event.topicInfo != null) { Topic topic = event.topicInfo.getTopic(); - if (!topic.equals(m_typePublisher.getTopic())) { - event.topicInfo.getTopic().setPersistent(true); + if (!topic.equals(typePublisherTopic)) { + topic.setPersistent(true); } } });