mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-20 00:51:42 +00:00
[ntcore] Provide mechanism to reset internals of NT instance (#4653)
This commit is contained in:
@@ -174,3 +174,15 @@ std::shared_ptr<INetworkClient> InstanceImpl::GetClient() {
|
||||
std::scoped_lock lock{m_mutex};
|
||||
return m_networkClient;
|
||||
}
|
||||
|
||||
void InstanceImpl::Reset() {
|
||||
std::scoped_lock lock{m_mutex};
|
||||
m_networkServer.reset();
|
||||
m_networkClient.reset();
|
||||
m_servers.clear();
|
||||
networkMode = NT_NET_MODE_NONE;
|
||||
|
||||
listenerStorage.Reset();
|
||||
// connectionList should have been cleared by destroying networkClient/server
|
||||
localStorage.Reset();
|
||||
}
|
||||
|
||||
@@ -56,6 +56,8 @@ class InstanceImpl {
|
||||
std::shared_ptr<NetworkServer> GetServer();
|
||||
std::shared_ptr<INetworkClient> GetClient();
|
||||
|
||||
void Reset();
|
||||
|
||||
ListenerStorage listenerStorage;
|
||||
LoggerImpl logger_impl;
|
||||
wpi::Logger logger;
|
||||
|
||||
@@ -320,6 +320,19 @@ bool ListenerStorage::WaitForListenerQueue(double timeout) {
|
||||
return wpi::WaitForObject(h, timeout, &timedOut);
|
||||
}
|
||||
|
||||
void ListenerStorage::Reset() {
|
||||
std::scoped_lock lock{m_mutex};
|
||||
m_pollers.clear();
|
||||
m_listeners.clear();
|
||||
m_connListeners.clear();
|
||||
m_topicListeners.clear();
|
||||
m_valueListeners.clear();
|
||||
m_logListeners.clear();
|
||||
if (m_thread) {
|
||||
m_thread.Stop();
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<std::pair<NT_Listener, unsigned int>>
|
||||
ListenerStorage::DoRemoveListeners(std::span<const NT_Listener> handles) {
|
||||
std::vector<std::pair<NT_Listener, unsigned int>> rv;
|
||||
|
||||
@@ -59,6 +59,8 @@ class ListenerStorage final : public IListenerStorage {
|
||||
|
||||
bool WaitForListenerQueue(double timeout);
|
||||
|
||||
void Reset();
|
||||
|
||||
private:
|
||||
// these assume the mutex is already held
|
||||
NT_Listener DoAddListener(NT_ListenerPoller pollerHandle);
|
||||
|
||||
@@ -2187,3 +2187,9 @@ void LocalStorage::StopDataLog(NT_DataLogger logger) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LocalStorage::Reset() {
|
||||
std::scoped_lock lock{m_mutex};
|
||||
m_impl = std::make_unique<Impl>(m_impl->m_inst, m_impl->m_listenerStorage,
|
||||
m_impl->m_logger);
|
||||
}
|
||||
|
||||
@@ -209,6 +209,8 @@ class LocalStorage final : public net::ILocalStorage {
|
||||
std::string_view logPrefix);
|
||||
void StopDataLog(NT_DataLogger logger);
|
||||
|
||||
void Reset();
|
||||
|
||||
private:
|
||||
class Impl;
|
||||
std::unique_ptr<Impl> m_impl;
|
||||
|
||||
@@ -45,6 +45,12 @@ NT_Inst CreateInstance() {
|
||||
return Handle{InstanceImpl::Alloc(), 0, Handle::kInstance};
|
||||
}
|
||||
|
||||
void ResetInstance(NT_Inst inst) {
|
||||
if (auto ii = InstanceImpl::GetTyped(inst, Handle::kInstance)) {
|
||||
ii->Reset();
|
||||
}
|
||||
}
|
||||
|
||||
void DestroyInstance(NT_Inst inst) {
|
||||
int i = Handle{inst}.GetTypedInst(Handle::kInstance);
|
||||
if (i < 0) {
|
||||
|
||||
Reference in New Issue
Block a user